Saya perlu menghapus semua folder di dalam folder menggunakan skrip harian. Folder untuk hari itu perlu dibiarkan.
Folder 'myfolder' memiliki 3 sub folder: 'test1', 'test2' dan 'test3' Saya harus menghapus semua kecuali 'test2'.
Saya mencoba mencocokkan nama yang tepat di sini:
find /home/myfolder -type d ! -name 'test2' | xargs rm -rf
ATAU
find /home/myfolder -type d ! -name 'test2' -delete
Perintah ini selalu mencoba untuk menghapus folder utama 'myfolder' juga! Apakah ada cara untuk menghindari ini?
!
operator itu:\!
atau'!'
.Jawaban:
Ini akan menghapus semua folder di dalamnya
./myfolder
kecuali itu./myfolder/test2
dan semua kontennya akan dipertahankan:Bagaimana itu bekerja
find
memulai perintah find../myfolder
memberitahu find untuk memulai dengan direktori./myfolder
dan isinya.-mindepth 1
tidak cocok dengan./myfolder
dirinya sendiri, hanya file dan direktori di bawahnya.! -regex '^./myfolder/test2\(/.*\)?'
memberitahu find untuk mengecualikan (!
) file atau direktori yang cocok dengan ekspresi reguler^./myfolder/test2\(/.*\)?
.^
cocok dengan awal nama jalur. Ekspresi(/.*\)?
cocok dengan (a) garis miring diikuti oleh apa pun atau (b) tidak ada sama sekali.-delete
memberitahu find untuk menghapus file yang cocok (yaitu, tidak dikecualikan).Contoh
Pertimbangkan struktur direktori yang mirip;
Kita dapat menjalankan perintah find (tanpa
-delete
) untuk melihat apa yang cocok:Kami dapat memverifikasi bahwa ini berfungsi dengan melihat file yang tersisa:
sumber
-prune
meninggalkantest2/*/
subdirektori sendirian: kembali kerm -r
dan tambahkan-maxdepth 1
../myfolder
. Anda memerlukan yang tidak ada (IMvhO) hanya-type d
untuk direktori .find ./myfolder -depth -mindepth 1 -maxdepth 1 -type d ! -regex '^./myfolder/test2\(/.*\)?'
Menggunakan bash :
Contoh:
sumber
tl; dr
Hapus gema jika puas dengan daftar file.
Menggunakan
-mindepth 1
akan memastikan bahwa direktori teratas tidak dipilih.Tapi
-not -name test2
akan tidak menghindari subdirs dalamtest2
:Untuk melakukan itu, Anda perlu sesuatu seperti prune:
Tapi jangan gunakan
delete
, seperti yang tersiratdepth
dan itu akan mulai dihapus dari jalur terpanjang:Gunakan salah satu
rm -rf
(hapusecho
jika Anda ingin benar-benar menghapus):Atau, gunakan juga
maxdepth
jika yang Anda butuhkan adalah menghapus direktori (dan semua yang ada di dalamnya) (hapusecho
untuk benar-benar menghapus):A
-delete
masih akan gagal jika direktori tidak kosong:sumber
Jika Anda menggunakan zsh, maka Anda dapat:
sumber
Diuji dengan perintah di bawah ini dan bekerja dengan baik
sumber
-mindepth 1
) membuat direktori teratas cocok dengan semua kriteria (itu adalah direktori dan itu tidak bernama "test2") sehingga dihapus.