Ini akan menghapus semua folder di dalam ./myfolder
kecuali ./myfolder/test2
itu dan semua isinya akan dipertahankan:
find ./myfolder -mindepth 1 ! -regex '^./myfolder/test2\(/.*\)?' -delete
Cara kerjanya
find
memulai perintah find.-
./myfolder
memberitahu find untuk memulai dengan direktori./myfolder
dan isinya. -
-mindepth 1
tidak cocok dengan./myfolder
itu sendiri, hanya file dan direktori di bawahnya. -
! -regex '^./myfolder/test2\(/.*\)?'
memberi tahu find untuk mengecualikan (!
) file atau direktori apa pun yang cocok dengan ekspresi reguler^./myfolder/test2\(/.*\)?
.^
cocok dengan awal nama jalur. Ekspresi(/.*\)?
cocok dengan (a) garis miring diikuti dengan apa saja atau (b) tidak sama sekali. -
-delete
memberi tahu find untuk menghapus file yang cocok (yaitu, tidak dikecualikan).
Contoh
Pertimbangkan struktur direktori yang terlihat seperti;
$ find ./myfolder
./myfolder
./myfolder/test1
./myfolder/test1/dir1
./myfolder/test1/dir1/test2
./myfolder/test1/dir1/test2/file4
./myfolder/test1/file1
./myfolder/test3
./myfolder/test3/file3
./myfolder/test2
./myfolder/test2/file2
./myfolder/test2/dir2
Kita dapat menjalankan perintah find (tanpa -delete
) untuk melihat kecocokannya:
$ find ./myfolder -mindepth 1 ! -regex '^./myfolder/test2\(/.*\)?'
./myfolder/test1
./myfolder/test1/dir1
./myfolder/test1/dir1/test2
./myfolder/test1/dir1/test2/file4
./myfolder/test1/file1
./myfolder/test3
./myfolder/test3/file3
Kami dapat memverifikasi bahwa ini berfungsi dengan melihat file yang tersisa:
$ find ./myfolder
./myfolder
./myfolder/test2
./myfolder/test2/file2
./myfolder/test2/dir2
Menggunakan bash:
shopt -s extglob
rm -r myfolder/!(test2)/
Contoh:
$ tree myfolder/
myfolder/
├── test1
│ └── file1
├── test2
│ └── file2
└── test3
└── file3
$ echo rm -r myfolder/!(test2)
rm -r myfolder/test1 myfolder/test3
$ rm -r myfolder/!(test2)
$ tree myfolder/
myfolder/
└── test2
└── file2
1 directory, 1 file
tl;dr
find ./myfolder -mindepth 1 -maxdepth 1 -type d -not -name test2 \
-exec echo rm -rf '{}' \;
Hapus gema jika puas dengan daftar file.
Menggunakan -mindepth 1
akan memastikan bahwa atas direktori tidak dipilih.
$ find ./myfolder -mindepth 1 -type d
./myfolder/test2
./myfolder/test2/one
./myfolder/test2/two
./myfolder/test
./myfolder/test/a1
./myfolder/test/a1/a2
./myfolder/test/a1/a2/a3
Tapi -not -name test2
akan tidak hindari subdirektori di dalam test2
:
$ find ./myfolder -mindepth 1 -type d -not -name 'test2'
./myfolder/test2/one
./myfolder/test2/two
./myfolder/test
./myfolder/test/a1
./myfolder/test/a1/a2
./myfolder/test/a1/a2/a3
Untuk melakukannya, Anda memerlukan sesuatu seperti pangkas:
$ find ./myfolder -mindepth 1 -name test2 -prune -o -type d -print
./myfolder/test
./myfolder/test/a1
./myfolder/test/a1/a2
./myfolder/test/a1/a2/a3
Tapi jangan gunakan delete
, seperti yang tersirat depth
dan itu akan mulai dihapus dari jalur terpanjang:
$ find ./myfolder -depth -mindepth 1 -name test2 -prune -o -type d -print
./myfolder/test/a1/a2/a3
./myfolder/test/a1/a2
./myfolder/test/a1
./myfolder/test
Gunakan rm -rf
(hapus echo
jika Anda ingin benar-benar menghapus):
$ find ./myfolder -mindepth 1 -name test2 -prune -o -type d -exec echo rm -rf '{}' \;
rm -rf ./myfolder/test
rm -rf ./myfolder/test/a1
rm -rf ./myfolder/test/a1/a2
rm -rf ./myfolder/test/a1/a2/a3
Atau, juga gunakan maxdepth
jika yang Anda butuhkan hanyalah menghapus direktori (dan semua yang ada di dalamnya) (hapus echo
untuk benar-benar menghapus):
$ find ./myfolder -mindepth 1 -maxdepth 1 -type d -not -name test2 -exec echo rm -rf '{}' \;
rm -rf ./myfolder/test
A -delete
masih akan gagal jika direktori tidak kosong:
$ find ./myfolder -mindepth 1 -maxdepth 1 -type d -not -name test2 -delete
find: cannot delete ‘./myfolder/test’: Directory not empty