Bagaimana cara menghapus semua direktori kosong di direktori dari baris perintah?


58

Katakanlah saya memiliki direktori bernama foo/. Folder ini termasuk subdirektori. Bagaimana saya bisa menghapus semua direktori kosong dalam satu perintah?

Jawaban:


119

Coba perintah ini:

find . -empty -type d -delete

The findPerintah ini digunakan untuk mencari file / direktori yang cocok dengan kriteria pencarian tertentu dari jalur yang ditetapkan, dalam hal ini direktori saat (maka .).

The -emptypilihan berlaku untuk setiap file dan direktori yang kosong.

The -type dpilihan berlaku untuk file yang tipe tertentu; dalam hal ini dberarti direktori jenis file .

The -deletepilihan adalah tindakan untuk melakukan, dan berlaku untuk semua file yang ditemukan dalam pencarian.


Saya pikir ini adalah cara termudah untuk melakukannya sehingga saya akan melanjutkan dan menandainya sebagai jawaban.
justingrif

Hei Bill, saya mencoba memposting pertanyaan serupa dan itu tidak membiarkan saya karena mengatakan itu adalah penipuan, jadi saya berharap Anda mungkin bisa menjawab saya di sini. Katakanlah saya ingin melakukan hal yang sama seperti di atas tetapi hapus semua direktori apakah itu kosong atau tidak.
justingrif

3
Cara Anda akan menghapus direktori, terlepas dari apakah atau tidak mereka kosong, ketik perintah berikut: rm -rf <directory-name>. Ini akan menghapus direktori, beserta semua isinya termasuk file dan subdirektori. The -rpilihan berarti menghapus secara rekursif, sementara -fberarti perintah tidak meminta sebelum menghapus. Namun, jika Anda ingin diminta sebelum menghapus direktori / file, ganti -fopsi dengan -iopsi.
Bill

Bagaimana jika ada beberapa file dalam direktori yang ingin saya simpan. Jadi, saya ingin menghapus semua direktori di / foo / bar / tetapi menyimpan semua file yang mungkin ada di sana.
justingrif

2
Dimungkinkan untuk melakukan ini dengan menggunakan pipa untuk memberi makan stdoutdari satu perintah (misalnya find) ke yang stdinlain (misalnya rm), bagaimanapun, sangat berhati-hati karena dapat menghapus atau menghapus file / direktori yang Anda tidak ingin menghapus! Untuk informasi lebih lanjut tentang cara melakukan ini, lihat manhalaman untuk masing-masing perintah ini. Agar aman, selalu uji hal-hal seperti itu di direktori sementara sebelum mencoba hal yang nyata.
Bill

11

Anda dapat mengambil keuntungan dari rmdirpenolakan perintah untuk menghapus direktori yang tidak kosong, dan find -depthopsi untuk melintasi pohon direktori bottom-up:

find . -depth -exec rmdir {} \;  

(dan abaikan kesalahan), atau tambahkan 2>/dev/nulluntuk benar-benar mengabaikannya.

The -depthpilihan untuk findmulai mencari di bawah pohon direktori.

rm -rfakan menghapus semua file di direktori (dan subdirektori, dan ....) DAN semua direktori dan segalanya.


8
rmdir *

Akan menghapus semua direktori kosong. Ini akan memunculkan kesalahan untuk setiap direktori dan file yang tidak kosong, untuk menghentikan kesalahan dari mengacaukan terminal Anda, gunakan

rmdir * 2> /dev/null

Ini tidak cocok untuk skrip karena akan keluar dengan kode status non-nol tetapi berfungsi.
the_drow

@the_drow bagaimana cara membuatnya tidak cocok? Omong-omong, Anda juga bisa menggunakan rmdir * 2>/dev/null || true. (Cara find (1) lebih baik untuk skrip tetapi karena alasan lain: karena itu mengekspresikan lebih baik apa yang ingin Anda lakukan.)
Alois Mahdal

Saya sering melakukan ini di $HOME. Dengan seringai jahat.
Alois Mahdal

Karena itu akan melaporkan kegagalan jika beberapa direktori tidak kosong.
the_drow

Apakah ini lebih cepat daripada metode find? Adakah yang membandingkan keduanya?
Xerus

1
find . -type d -empty -delete -maxdepth 1

Karena jika Anda hanya ingin menghapus subdirektori langsung dari foo/.


0

Pendekatan python

$ tree                                                                                                                                                                                  
.
├── empty_dir1
├── empty_dir2
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

4 directories, 4 files
$ python -c 'import os;empty=[r for r,s,f in os.walk(".") if not f and not s and r != "." ];map(lambda x: os.rmdir(x),empty)'
$ tree
.
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

Ini berfungsi seperti ini:

  • kami menggunakan os.walk()fungsi untuk berjalan secara rekursif pohon direktori. Pada setiap iterasi rdiatur ke folder saat ini yang kita akses, sberisi daftar direktori di dalamnya r, dan fakan berisi daftar file di folder itu. Tentu saja jika fdan skosong, kita tahu itu rkosong.
  • daftar-pemahaman pertama memungkinkan kita untuk membuat empty, daftar semua direktori yang kosong, berdasarkan evaluasi yang dinyatakan di atas.
  • fungsi kedua, map()digunakan untuk melakukan os.rmdir()pada setiap item dalam emptydaftar. Pemahaman daftar dapat digunakan sebagai alternatif.

Sebagai skrip ini akan seperti itu:

#!/usr/bin/env python
import os
empty=[]
for r,s,f in os.walk("."):
    if not f and not s and r != ".":
        empty.append(r)

for i in empty:
    os.rmdir(i)

terlalu rumit untuk hanya pertanyaan :(
nurulhudamustaqim

@nurulhudamustaqim Tergantung pada sudut pandang. Untuk banyak pengguna Linux yang terbiasa dengan Python ini sebenarnya sangat sederhana :) Dan selain variasinya. Administrasi sistem modern tidak terbatas pada bash atau /bin/shhanya dan Python sebenarnya bahasa yang lebih elegan daripada keduanya
Sergiy Kolodyazhnyy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.