Hapus file tanpa nama string

9

Saya ingin menghapus file yang tidak memiliki string '999' (tanpa '') dalam namanya.

Saya telah mencoba:

grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --

Tapi tidak satu pun dari mereka yang berfungsi. Saya menggunakan macOS Sierra, dengan bash: 3.2.57.

Plr
sumber
2
grep -lmenyebabkannya untuk membuat daftar file di mana kecocokan ditemukan (atau tidak ditemukan dengan -v) dalam konten , bukan nama file. grepselalu cocok dengan konten file yang Anda tentukan, tidak pernah namanya.
JoL

Jawaban:

18

Menggunakan pola globbing yang diperluas dalam bash:

rm ./!(*999*)

Ini perlu shopt -s extglobdiaktifkan (dan untuk keamanan juga shopt -s failglob, sehingga tidak ada file dengan nama yang tidak biasa !(*999*)dihapus secara tidak sengaja jika semua nama file berisi 999). Pola !(*999*)akan cocok dengan nama apa pun di direktori saat ini, kecuali nama-nama yang cocok *999*. Untuk juga menghapus file tersembunyi (file yang namanya dimulai dengan titik ), aktifkan juga dotglobopsi.

Untuk hanya peduli tentang file biasa atau tautan simbolis ke file biasa (bukan direktori, dll.):

for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done

The zshshell setara dengan lingkaran di atas akan

rm ./(^(*999*))(.)

Perintah pertama Anda tidak akan berfungsi karena grepakan melihat ke dalam file. Ini akan menghapus semua file yang memiliki baris tanpa 999di dalamnya (Anda telah menambahkan --nullopsi sehingga berfungsi dengan xargs -0).

Perintah kedua Anda tidak akan berfungsi karena greppada macOS tidak mendukung --null-data(namun ia memiliki --nullopsi, tetapi hanya untuk saat menghasilkan keluaran nama file). Juga mencatat bahwa hal itu akan mencari 999di mana saja di file path (termasuk komponen direktori), tidak hanya nama file.

Kusalananda
sumber
1
Anda juga ingin mengaktifkan failglobopsi atau akhirnya dapat menghapus file yang dipanggil !(*999*)jika tidak ada file lain yang namanya tidak mengandung 999.
Stéphane Chazelas
16

Balikkan kondisi nama di find:

find . -type f \! -name "*999*" 

Tambah -deleteatau -exec rm {} +untuk benar-benar menghapus file yang cocok.

ilkkachu
sumber
2
!aman di bash.
Kusalananda