hapus pola pencocokan file

32

Saya perlu menghapus semua file secara rekursif di semua subdirs di mana nama file berisi angka diikuti oleh 'x' diikuti oleh angka, setidaknya dua kali.

Contoh:

Saya ingin menghapus file-file ini:

'aaa-12x123-123x12.jpg'
'aaa-12x12-123x12-12x123.jpg'

Tetapi saya TIDAK ingin menghapus file-file ini:

'aaa.jpg'
'aaa-12x12.jpg'
'aaaxaaa-123x123.jpg'
'aaaxaaa-aaaxaaa.jpg'

Bagaimana saya bisa melakukan itu (dari bash shell)

mikkelbreum
sumber

Jawaban:

61

String berisi "angka diikuti oleh xdiikuti oleh angka" jika dan hanya jika mengandung angka diikuti oleh xangka, yaitu jika berisi substring yang cocok dengan pola [0-9]x[0-9]. Jadi Anda ingin menghapus file yang namanya cocok dengan pola tersebut *[0-9]x[0-9]*[0-9]x[0-9]*.jpg.

find /path/to/directory -type f -name '*[0-9]x[0-9]*[0-9]x[0-9]*.jpg' -delete

Jika findtidak -delete, panggil rmuntuk menghapus file.

find /path/to/directory -type f -name '*[0-9]x[0-9]*[0-9]x[0-9]*.jpg' -exec rm {} +
Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
Terima kasih! 12.000 file hilang dalam 2 detik. Itu menyelamatkan saya beberapa pekerjaan manual!
mikkelbreum
Baik -deleteatau -exec rmbekerja untuk saya di Bash pada Windows. Tapi ini berhasil:find /path/to/directory -type f -name '*[0-9]x[0-9]*[0-9]x[0-9]*.jpg' | xargs rm
Tamlyn
2
@Tamlyn Gunakan -print0dan xargs -0, jika tidak, perintah akan gagal dengan nama file yang berisi spasi atau kutipan tunggal. Tapi -deletedan -exec rm melakukan pekerjaan pada Windows. Jika sesuatu tidak berfungsi, itu bukan karena penggunaannya.
Gilles 'SANGAT berhenti menjadi jahat'
Apakah ini akan bekerja dengan Windows juga?
CodyBugstein
Ini akan berfungsi jika Anda memiliki port utilitas Unix seperti Cygwin atau GNUWin32. Jelas itu tidak akan bekerja di luar kotak pada Windows. Berhati-hatilah bahwa Windows memiliki program yang tidak terkait yang dipanggil find, jadi pastikan utilitas Unix masuk terlebih dahulu PATH.
Gilles 'SANGAT berhenti menjadi jahat'
0

Perintah yang benar adalah:

find . -type f -iregex '.*[0-9]x[0-9]*\.jpg$'

ini hanya akan mengambil file dengan nama: 'aaa-12x12.jpg', tetapi tidak 'aaa-12x12red.jpg'

MasterR
sumber