Adında dize olmayan dosyaları kaldır


9

Adlarında '999' ('' olmadan) dizesi olmayan dosyaları kaldırmak istiyorum.

Denedim:

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

Ama hiçbiri çalışmıyor. 3.2.57 bash ile macOS Sierra kullanıyorum.


2
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
JoL

Yanıtlar:


18

İç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 .


1
Ayrıca failglobseçeneği etkinleştirmek istersiniz veya !(*999*)adı içermeyen başka bir dosya yoksa adlı dosyayı kaldırırsınız 999.
Stéphane Chazelas

16

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.


2
!güvenli bash.
Kusalananda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.