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.
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.Jawaban:
Menggunakan pola globbing yang diperluas dalam
bash
:Ini perlu
shopt -s extglob
diaktifkan (dan untuk keamanan jugashopt -s failglob
, sehingga tidak ada file dengan nama yang tidak biasa!(*999*)
dihapus secara tidak sengaja jika semua nama file berisi999
). 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 jugadotglob
opsi.Untuk hanya peduli tentang file biasa atau tautan simbolis ke file biasa (bukan direktori, dll.):
The
zsh
shell setara dengan lingkaran di atas akanPerintah pertama Anda tidak akan berfungsi karena
grep
akan melihat ke dalam file. Ini akan menghapus semua file yang memiliki baris tanpa999
di dalamnya (Anda telah menambahkan--null
opsi sehingga berfungsi denganxargs -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 mencari999
di mana saja di file path (termasuk komponen direktori), tidak hanya nama file.sumber
failglob
opsi atau akhirnya dapat menghapus file yang dipanggil!(*999*)
jika tidak ada file lain yang namanya tidak mengandung999
.Balikkan kondisi nama di
find
:Tambah
-delete
atau-exec rm {} +
untuk benar-benar menghapus file yang cocok.sumber
!
aman dibash
.