Yanıtlar:
İçinde genişletilmiş bir globbing deseni kullanma bash
:
rm ./!(*999*)
Bunun shopt -s extglob
etkinleştirilmesi gerekir (ve güvenlik için, tüm dosya adları içeriyorsa shopt -s failglob
olağandışı ada sahip hiçbir dosya !(*999*)
yanlışlıkla kaldırılmaz 999
). Kalıp !(*999*)
, eşleşen adlar hariç, geçerli dizindeki herhangi bir adla eşleşir *999*
. Gizli dosyaları (adı bir nokta ile başlayan dosyalar) da kaldırmak için dotglob
seçeneği de etkinleştirin .
Yalnızca normal dosyalara veya normal dosyalara (dizinlere değil) sembolik bağlantılara dikkat etmek için:
for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done
zsh
Yukarıdaki döngü kabuk eşdeğer olacaktır
rm ./(^(*999*))(.)
İlk komutunuz çalışmayacak çünkü grep
dosyaların içine bakacak. İçinde satır olmayan tüm dosyaları kaldıracaktır 999
( --null
seçeneği ile birlikte çalışmış olsaydınız xargs -0
).
grep
MacOS'ta desteklemediğinden ikinci komutunuz çalışmayacaktır --null-data
(ancak bir --null
seçeneği vardır, ancak yalnızca dosya adı çıktısı oluştururken içindir). Ayrıca , yalnızca dosyanın adını değil, dosyanın yolunda (dizin bileşenleri dahil) 999
herhangi bir yeri arayacağını da unutmayın .
failglob
seçeneği etkinleştirmek istersiniz veya !(*999*)
adı içermeyen başka bir dosya yoksa adlı dosyayı kaldırırsınız 999
.
Sadece ad koşulunu şurada ters çevirin find
:
find . -type f \! -name "*999*"
Eşleşen dosyaları gerçekten ekleyin -delete
veya -exec rm {} +
kaldırın.
!
güvenli bash
.
grep -l
dosya adında değil, içerikte bir eşleşmenin bulunduğu (veya ile bulunamadığı-v
) dosyaları listelemesine neden olur . her zaman belirttiğiniz dosyaların içeriğiyle eşleşir, adlarıyla asla eşleşmez.grep