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?
123
shopt -s dotglob
sebelum menjalankanrm (...)
.Jawaban:
Apa yang saya lakukan dalam kasus itu adalah mengetik
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.
sumber
*
mengembang juga tidak terlalu lama. : -}Ctrl
+Shift
+x
+*
Untuk
rm
semua kecualiu,p
dalam bash ketik saja:Ini membutuhkan opsi berikut untuk ditetapkan:
Lihat lebih lanjut: glob - Greg's Wiki
sumber
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
!
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
sumber
-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 globSederhana:
mv
file yang Anda inginkan di direktori atas,rm
direktori dan kemudianmv
kembali.sumber
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)
sumber
rm [^up]*
? Saya sering melakukan hal serupa.Melakukannya tanpa menemukan:
(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.
sumber
-E
atauegrep
u
atau ap
grep -L (u|p)' * | xargs rm
mana-L
berarti daftar nama file yang tidak mengandung kecocokan.u
ataup
, bukan file apa pun yang mengandung au
atau ap
. Itu betul. Anda dapat memperbaikinya dengan menggunakanegrep -v '^(u|p)$'
ls | grep -v 'vuze\|progs' | xargs rm -rf
Dalam zsh:
kemudian
atau
Yang kedua akan bekerja bahkan jika Anda memiliki
^
di$histchars
untuk substitusi sejarah, dan tentu saja Anda dapat menempatkan segumpal sewenang-wenang sebelum~
.sumber
GLOBIGNORE mengambil daftar yang dipisahkan oleh titik dua
sumber
rm
atau di direktori pengujian!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:
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.
sumber
Ini akan menghapus semua file kecuali u dan p di unix
sumber
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
danp
dalam direktori saat ini dalam contoh ini. Ini mungkin berguna untuk skrip.sumber
-regextype
hanya akan bekerja pada versi GNUfind
adalah perpanjanganfind
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.Saya selalu menggunakan:
Ini akan memungkinkan Anda untuk menentukan seberapa rinci Anda ingin membuatnya. Jadi jika Anda ingin menghapus file o dan Z Anda dapat menggunakan:
sumber
Versi lain menggunakan
xargs
:Catatan yang
xargs -I
diperlukan untuk menangani nama file termasuk spasi dengan benar.sumber
Lagi:
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.
sumber
Berikut varian lainnya. Anda dapat mengetik:
atau:
Jadi
rm
akan meminta Anda untuk mengonfirmasi penghapusan setiap file.sumber
Menggunakan:
untuk menghapus semua file termasuk direktori, kecuali file u, p dan .ext.
sumber
Cara sederhana yang sulit dikacaukan: misalkan Anda ingin menghapus semuanya kecuali * .pdf:
sumber