Katakanlah saya memiliki direktori bernama foo/
. Folder ini termasuk subdirektori. Bagaimana saya bisa menghapus semua direktori kosong dalam satu perintah?
Katakanlah saya memiliki direktori bernama foo/
. Folder ini termasuk subdirektori. Bagaimana saya bisa menghapus semua direktori kosong dalam satu perintah?
Jawaban:
Coba perintah ini:
find . -empty -type d -delete
The find
Perintah ini digunakan untuk mencari file / direktori yang cocok dengan kriteria pencarian tertentu dari jalur yang ditetapkan, dalam hal ini direktori saat (maka .
).
The -empty
pilihan berlaku untuk setiap file dan direktori yang kosong.
The -type d
pilihan berlaku untuk file yang tipe tertentu; dalam hal ini d
berarti direktori jenis file .
The -delete
pilihan adalah tindakan untuk melakukan, dan berlaku untuk semua file yang ditemukan dalam pencarian.
rm -rf <directory-name>
. Ini akan menghapus direktori, beserta semua isinya termasuk file dan subdirektori. The -r
pilihan berarti menghapus secara rekursif, sementara -f
berarti perintah tidak meminta sebelum menghapus. Namun, jika Anda ingin diminta sebelum menghapus direktori / file, ganti -f
opsi dengan -i
opsi.
stdout
dari satu perintah (misalnya find
) ke yang stdin
lain (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 man
halaman untuk masing-masing perintah ini. Agar aman, selalu uji hal-hal seperti itu di direktori sementara sebelum mencoba hal yang nyata.
Anda dapat mengambil keuntungan dari rmdir
penolakan perintah untuk menghapus direktori yang tidak kosong, dan find -depth
opsi untuk melintasi pohon direktori bottom-up:
find . -depth -exec rmdir {} \;
(dan abaikan kesalahan), atau tambahkan 2>/dev/null
untuk benar-benar mengabaikannya.
The -depth
pilihan untuk find
mulai mencari di bawah pohon direktori.
rm -rf
akan menghapus semua file di direktori (dan subdirektori, dan ....) DAN semua direktori dan segalanya.
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
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.)
$HOME
. Dengan seringai jahat.
find . -type d -empty -delete -maxdepth 1
Karena jika Anda hanya ingin menghapus subdirektori langsung dari foo/
.
$ 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:
os.walk()
fungsi untuk berjalan secara rekursif pohon direktori. Pada setiap iterasi r
diatur ke folder saat ini yang kita akses, s
berisi daftar direktori di dalamnya r
, dan f
akan berisi daftar file di folder itu. Tentu saja jika f
dan s
kosong, kita tahu itu r
kosong.empty
, daftar semua direktori yang kosong, berdasarkan evaluasi yang dinyatakan di atas.map()
digunakan untuk melakukan os.rmdir()
pada setiap item dalam empty
daftar. 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)
/bin/sh
hanya dan Python sebenarnya bahasa yang lebih elegan daripada keduanya