Yanıtlar:
İçinde genişletilmiş bir globbing deseni kullanma bash:
rm ./!(*999*)
Bunun shopt -s extglobetkinleştirilmesi gerekir (ve güvenlik için, tüm dosya adları içeriyorsa shopt -s failglobolağ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 dotglobseç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
zshYukarıdaki döngü kabuk eşdeğer olacaktır
rm ./(^(*999*))(.)
İlk komutunuz çalışmayacak çünkü grepdosyaların içine bakacak. İçinde satır olmayan tüm dosyaları kaldıracaktır 999( --nullseçeneği ile birlikte çalışmış olsaydınız xargs -0).
grepMacOS'ta desteklemediğinden ikinci komutunuz çalışmayacaktır --null-data(ancak bir --nullseç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) 999herhangi bir yeri arayacağını da unutmayın .
failglobseç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 -deleteveya -exec rm {} +kaldırın.
!güvenli bash.
grep -ldosya 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