Bagaimana cara menghapus file pada baris perintah dengan ekspresi reguler?

18

Katakanlah saya memiliki 20 file bernama FOOXX, di mana XX adalah jumlah file, misalnya 01, 02 dll.

Saat ini, jika saya ingin menghapus semua file lebih rendah dari angka 10, ini mudah dan saya hanya menggunakan wildcard, misalnya rm FOO0 *

Namun, jika saya ingin menghapus file tertentu dalam kisaran, misalnya 13-15, ini menjadi lebih sulit.

rm FPP [13-15] tidak berfungsi, dan bertanya apakah saya ingin menghapus semua file. Likewse rm FOO1 [3-5] ingin menghapus semua file yang dimulai dengan FOO1

Jadi, apa cara terbaik untuk menghapus rentang file seperti ini?

Saya telah mencoba dengan bash dan zsh, dan saya tidak berpikir mereka sangat berbeda untuk tugas dasar seperti itu?

Mendongkrak
sumber
"... rm FOO1 [3-5] ingin menghapus semua file yang dimulai dengan FOO1" Ini tidak masuk akal, dan tentu saja tidak demikian di sini.
Ignacio Vazquez-Abrams
@Ignacio yeah- Saya ingin melihat set karakter memiliki urutan pemeriksaan!
kmarsh

Jawaban:

31

Dalam bash Anda dapat menggunakan:

rm FOO1 {3..5}

atau

rm FOO1 {3,4,5}

untuk menghapus FOO13, FOO14 dan FOO15.

Penjepit ekspansi Bash didokumentasikan di sini .

Mike Fitzpatrick
sumber
2
Atau bahkan rm FOO{13..15}.
Ignacio Vazquez-Abrams
Apakah ini juga berlaku untuk ZSH?
Jack
@ Jack: Ya, benar.
Dijeda sampai pemberitahuan lebih lanjut.
@ Jack: bashperintah membentuk subset dari zperintah shell.
abhinavkulkarni
Jadi saya perlu belajar baik regex dan globbing sintaks. Huu huu. :)
Aditya MP
13

Untuk pembaca masa depan, findperintah ini juga dapat menghapus file. Saya menyelesaikan ini untuk masalah yang sama:

find . -type f -regex '...' -delete

tetapi jawaban yang dipilih adalah jawaban paling sederhana untuk pertanyaan ini.

GregWW
sumber
Jawaban yang dipilih hanya baik untuk file yang mengikuti konvensi penamaan. Berkat jawaban Anda, saya bisa menghapus semua file objek dalam direktori. (dalam kasus saya, saya hanya pergi dengan find . -name "*.o" -deletedan itu bekerja seperti pesona)
John Hamilton
6

ls | grep regex | xargs rm

gogiel
sumber
6
Anda harus menggunakan find -regex ... -print0 | xargs -0 ...ini, jika tidak, gagal untuk nama file dengan spasi.
Dijeda sampai pemberitahuan lebih lanjut.
1
Tentu saja, jika Anda akan menggunakan findmaka Anda mungkin juga hanya menggunakan -exec.
Ignacio Vazquez-Abrams
Dalam kasus saya file memiliki spasi, dan mengubah pembatas memperbaiki masalah spasi: ls | grep regex | xargs --delimiter = '\ n' rm
Anake
1
-1 untuk mencoba menguraikan ls
evilsoup
@ evilsoup, +1 untuk menambahkan peringatan itu, tetapi, siapa yang menyisipkan baris baru dalam nama file?
Iulian Onofrei