Jawaban:
Bash telah menambah globbing (tes pertama, lalu hapus gema):
shopt -s extglob
echo rm -rf !(A)
shopt | grep ext
Anda dapat melihat apakah plugin diaktifkan.
Bagaimana dengan:
mv A /tmp/
rm * -rf
mv /tmp/A .
Ini menghindari beberapa "kelangkaan" kesalahan ketik pada perintah lain.
Sesuatu seperti
find . -type d -not -name A -exec rm -ir {} \;
harus dilakukan.
sunting
Seharusnya memang begitu
find . -type d -maxdepth 1 -not -name A -exec rm -ir {} \;
untuk mencegah find
berulang di bawah A.
saya biasanya melakukan ini dengan menjalankan perintah ls yang mendapatkannya dengan benar terlebih dahulu. Saya tidak di mesin unix, tetapi sesuatu seperti:
ls -lda "[^ A]"
Setelah Anda melakukannya dengan benar, pipa ke perintah
ls -lda "[^ A]" | xargs rm -rf
Jangan ragu untuk mengedit di atas jika ekspresi reguler saya salah ...
Ini satu cara. Hati-hati dengan hal semacam ini, meskipun, itu sangat kuat sehingga hanya bisa digunakan untuk kebaikan atau kejahatan ...
temukan * -tipe d | grep -v "^ A" | xargs rm -rf
Jangan gunakan find karena beberapa orang telah menunjukkan dengan -exec dan rm tanpa melewati -print0 untuk menemukan dan -0 ke xargs. Ini akan menjadi bingung pada nama file dengan spasi atau baris baru:
$ mkdir 'foo foo'
$ mkdir foo$'\n'foo
$ find . -type d -exec rm -ir {} \;
rm: cannot remove directory `.'
rm: remove directory `./foo\nfoo'? y
find: `./foo\nfoo': No such file or directory
rm: remove directory `./foo foo'? y
find: `./foo foo': No such file or directory
Alih-alih gunakan find-print0 dengan xargs -0, '-exec command {} +', atau -delete jika find Anda mendukungnya.
Lihat juga di sini:
/programming/862388/delete-all-files-directories-except-two-specific-directories