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

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 .


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 .


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


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.


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$')


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.