Hapus file dengan ekspresi reguler

41

Saya Mencoba menghapus file yang dimulai dengan A dan diakhiri dengan 2 angka tetapi tidak berhasil.
Apa yang saya coba:

rm ^A*[0..9]2$

Dimana saya salah

gdoron mendukung Monica
sumber

Jawaban:

56

Anda dapat menggunakan perintah berikut untuk menghapus semua file yang cocok dengan kriteria Anda:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm

Bagaimana itu bekerja:

  1. ls daftar semua file (satu demi satu sejak hasilnya disalurkan).

  2. grep -P "^A.*[0-9]{2}$" memfilter daftar file dan hanya menyisakan yang cocok dengan ekspresi reguler ^A.*[0-9]{2}$

    • .*menunjukkan jumlah kemunculan ., di mana .wildcard cocok dengan karakter apa pun.

    • [0-9]{2}menunjukkan dengan tepat dua kemunculan [0-9], yaitu digit apa saja.

  3. xargs -d"\n" rmdijalankan rm linesekali untuk setiap lineyang disalurkan ke sana.

Dimana saya salah

Sebagai permulaan, rmtidak menerima ekspresi reguler sebagai argumen. Selain wildcard *, setiap karakter lain diperlakukan secara harfiah.

Juga, ekspresi reguler Anda sedikit tidak aktif. Misalnya, *berarti setiap kejadian ...dalam ekspresi reguler, sehingga A*pertandingan A, AA, dll dan bahkan string kosong.

Untuk informasi lebih lanjut, kunjungi Regular-Expressions.info .

Dennis
sumber
3
Waspadalah terhadap spasi dalam nama file.
slhck
1
The -d"\nsaklar perbaikan masalah ruang.
Frg
1
Catatan - beberapa distro (seperti Mac OS) tidak memiliki grep -P(Perl regex). grep -Edapat bekerja dalam kasus ini.
bluescrubbie
1
Saya lebih suka menggunakan -Idengan xargsdan selalu uji dengan perintah non-mematikan pertama:xargs -d"\n" -I {} echo "{}"
jozxyqk
1
Parsing ls? Lihat pertanyaan ini yang menunjuk ke artikel ini . Karena perangkap Anda mungkin rmapa yang tidak Anda inginkan.
Kamil Maciorowski
46

Atau menggunakan find:

find your-directory/ -name 'A*[0-9][0-9]' -delete

Solusi ini akan menangani nama file yang aneh .

cYrus
sumber
5
Ini solusi hebat. Saya lebih suka itu karena lebih sederhana dan Anda dapat menghilangkan flag -delete di akhir terlebih dahulu untuk melihat apakah regex Anda benar sebelum massa menghapus file Anda.
JAMESSTONEco
1
Selain itu, Anda memiliki kontrol lebih besar pada apa yang Anda hapus, misalnya menambahkan-type f
Marco Sulla
Apakah ini dapat digunakan untuk menghapus file dan folder? Ini tidak berfungsi untuk folder yang tidak kosong.
Alex
@Alex nggak, direktori harus kosong (itu bukan persyaratan OP), Anda dapat menggunakan xargspendekatan dengan rm -f.
cYrus
10

Lihat bagian ekspansi nama file dari halaman bash man:

rm A*[0-9][0-9]
glenn jackman
sumber
bekerja dengan baik untuk saya.
Nishanth Matha
Ini adalah jawaban paling sederhana, namun lengkap untuk pertanyaan itu.
Janac Meena
Apakah ini akan berfungsi jika folder memiliki banyak file?
Itay
1

Solusi dengan regexp adalah 200 kali lebih baik, bahkan dengan itu Anda dapat melihat file mana yang akan dihapus sebelum menggunakan perintah, memotong pipa terakhir:

ls | grep -P "^A.*[0-9]{2}$"

Maka jika benar gunakan saja:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm

Ini 200 kali lebih baik karena jika Anda bekerja dengan Unix, penting untuk mengetahui cara menggunakan grep. Ini sangat kuat jika Anda tahu cara menggunakannya.

Salvatore
sumber
1
Ini tampaknya tidak menambah banyak melampaui apa yang sudah dikatakan jawaban Dennis yang berusia 4 tahun .
8bittree
1
"200 kali" cukup spesifik. Banyak perintah lain yang juga sangat kuat, yang perlu Anda lakukan adalah mempelajari cara menggunakannya.
glenn jackman
1

Ini berfungsi di mac saya:

rm $(ls | grep -e '^A*[0..9]2$')

sinar
sumber
0

find Perintah bekerja dengan regex juga.

Periksa file mana yang akan dihapus

find . -regex '^A.*[0-9]{2}$'

Hapus file

find . -regex '^A.*[0-9]{2}$' -delete
Petr Javorik
sumber