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 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.
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.
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.
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.
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 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.empty, daftar semua direktori yang kosong, berdasarkan evaluasi yang dinyatakan di atas.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)
/bin/shhanya dan Python sebenarnya bahasa yang lebih elegan daripada keduanya