Menggunakan pola globbing yang diperluas dalam bash
:
rm ./!(*999*)
Ini perlu shopt -s extglob
diaktifkan (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 dotglob
opsi.
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 zsh
shell setara dengan lingkaran di atas akan
rm ./(^(*999*))(.)
Perintah pertama Anda tidak akan berfungsi karena grep
akan melihat ke dalam file. Ini akan menghapus semua file yang memiliki baris tanpa 999
di dalamnya (Anda telah menambahkan --null
opsi sehingga berfungsi dengan xargs -0
).
Perintah kedua Anda tidak akan berfungsi karena grep
pada macOS tidak mendukung --null-data
(namun ia memiliki --null
opsi, tetapi hanya untuk saat menghasilkan keluaran nama file). Juga mencatat bahwa hal itu akan mencari 999
di mana saja di file path (termasuk komponen direktori), tidak hanya nama file.
grep -l
menyebabkannya untuk membuat daftar file di mana kecocokan ditemukan (atau tidak ditemukan dengan-v
) dalam konten , bukan nama file.grep
selalu cocok dengan konten file yang Anda tentukan, tidak pernah namanya.