Saya perlu menghapus semua file dalam direktori, tetapi mengecualikan beberapa dari mereka. Misalnya, dalam direktori berisi file a b c ... z
, saya harus menghapus semua kecuali untuk u
dan p
. Apakah ada cara mudah untuk melakukan ini?
Saya perlu menghapus semua file dalam direktori, tetapi mengecualikan beberapa dari mereka. Misalnya, dalam direktori berisi file a b c ... z
, saya harus menghapus semua kecuali untuk u
dan p
. Apakah ada cara mudah untuk melakukan ini?
Jawaban:
Apa yang saya lakukan dalam kasus itu adalah mengetik
rm *
Lalu saya tekan Ctrl+ X, *untuk membuka *
ke semua nama file yang terlihat.
Kemudian saya bisa menghapus dua file yang ingin saya simpan dari daftar dan akhirnya mengeksekusi baris perintah.
*
mengembang juga tidak terlalu lama. : -}
Ctrl
+ Shift
+ x
+*
Untuk rm
semua kecuali u,p
dalam bash ketik saja:
rm !(u|p)
Ini membutuhkan opsi berikut untuk ditetapkan:
shopt -s extglob
Lihat lebih lanjut: glob - Greg's Wiki
shopt -s extglob
, @Ashot. Juga, ini hanya file, bukan direktori, itulah sebabnya saya menghapus -rf
opsi dalam perintah Anda.
rm !(index).html
. Ini akan menghapus semua file yang diakhiri dengan ".html" dengan pengecualian "index.html".
Anda dapat gunakan find
find . ! -name u ! -name p -maxdepth 1 -type f -delete
!
Meniadakan ekspresi berikutnya-name
menentukan nama file-maxdepth 1
akan membuat proses pencarian direktori yang ditentukan saja ( find
secara default melintasi direktori)-type f
hanya akan memproses file (dan bukan untuk direktori misalnya)-delete
akan menghapus fileAnda kemudian dapat menyesuaikan kondisi dengan melihat halaman manual find
Memperbarui
Uji perintah Anda terlebih dahulu dengan menggunakan -print
alih-alih-delete
find . ! -name u ! -name p -maxdepth 1 -type f -print
-delete
setelah .
itu akan menjadi bencana (akan menghapus semua file dalam CWD)
find . -maxdepth 1 -type f -name '[^up]' -delete
find
adalah sahabat saya, terutama ketika ada terlalu banyak file untuk glob
Sederhana:
mv
file yang Anda inginkan di direktori atas, rm
direktori dan kemudian mv
kembali.
rm
tanpa -r
tidak akan menghapus subdirektori.
Agak mirip dengan jawaban ini tetapi tidak ada opsi khusus yang diperlukan, sejauh yang saya tahu berikut ini adalah fungsionalitas "kuno" yang didukung oleh shell (menyerupai) / bin / sh yang menyerupai (misalnya bash, zsh, ksh, dll)
rm [^up]
rm [^up]*
? Saya sering melakukan hal serupa.
Melakukannya tanpa menemukan:
ls | grep -v '(u|p)' | xargs rm
(Sunting: "u" dan "v", seperti di tempat lain di sini, digunakan sebagai versi umum seluruh regex. Jelas Anda ingin berhati-hati untuk melabuhkan regex Anda untuk menghindari pencocokan terlalu banyak hal.)
Anda pasti akan menginginkan skrip jika Anda akan melakukan banyak hal, seperti yang disarankan orang lain.
-E
atauegrep
u
atau ap
grep -L (u|p)' * | xargs rm
mana -L
berarti daftar nama file yang tidak mengandung kecocokan.
u
atau p
, bukan file apa pun yang mengandung a u
atau a p
. Itu betul. Anda dapat memperbaikinya dengan menggunakanegrep -v '^(u|p)$'
ls | grep -v 'vuze\|progs' | xargs rm -rf
Kembali di era floppy saya memiliki file executable bernama "Kecuali" yang akan memindahkan hal-hal dari direktori saat ini sementara dan menjalankan perintah, sehingga Anda bisa mengatakan:
kecuali * .txt del *. *
untuk menghapus semuanya kecuali file teks Anda.
Ini akan menjadi hal yang cukup sepele untuk diterapkan sebagai skrip shell dan jika ini adalah jenis hal yang Anda kemungkinan akan lakukan lebih dari dua kali sepertinya itu akan menjadi ide yang baik.
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;
Ini akan menghapus semua file kecuali u dan p di unix
Bagi mereka yang lebih memilih untuk menentukan pola mengecualikan kompleks sewenang-wenang (mencakup semua nama file yang terkena dampak) dalam emacs regexp penuh sesak, gaya posix-awk atau posix-extended (lihat menemukan halaman manual) Saya akan merekomendasikan yang ini. Tidak termasuk u
dan p
dalam direktori saat ini dalam contoh ini. Ini mungkin berguna untuk skrip.
find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
-regextype
hanya akan bekerja pada versi GNU
find
adalah perpanjangan find
perintah GNU . Hal yang sama berlaku untuk -regextype
opsi. Selain itu, perintah Anda akan menghapus file dalam subdirektori juga, sedangkan pertanyaan awal dengan jelas bertanya tentang file dalam direktori.
Lagi:
for FILE in ./*; do if [[ $FILE != ./u* ]] || [[ $FILE != ./p* ]];then rm $FILE; fi; done;
Agak panjang dan saya tidak tahu apakah Anda dapat dengan mudah membuatnya menjadi fungsi yang dapat dengan mudah mengakomodasi dan sejumlah argumen, tetapi berfungsi dengan baik.
Dan itu murni kebaikan pesta.
Berikut varian lainnya. Anda dapat mengetik:
rm -i *
atau:
rm --interactive *
Jadi rm
akan meminta Anda untuk mengonfirmasi penghapusan setiap file.
Menggunakan:
find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
untuk menghapus semua file termasuk direktori, kecuali file u, p dan .ext.
Cara sederhana yang sulit dikacaukan: misalkan Anda ingin menghapus semuanya kecuali * .pdf:
mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp