Yanıtlar:
Kullanabilirsiniz find:
find . -type f ! -name '*.txt' -delete
Veya bash'in genişletilmiş globbing özellikleri:
shopt -s extglob
rm *.!(txt)
Veya zsh cinsinden:
setopt extendedglob
rm *~*.txt(.)
# || ^^^ Only plain files
# ||^^^^^ files ending in ".txt"
# | \Except
# \Everything
*.!(txt)olmak !(*.txt)?
rmvarsa ve klasör olsaydı boğulacak gibi olur.
find . -type f ! -name "*.txt" | xargs -r rmGNU \ xargs içinde çalışıp çalışmadığını kontrol edin . BSD ve UNIX xargs komutunda olmayabilir -r man xargs
'* .Txt' dışındaki tüm dosyaları silmek istiyorsanız , aşağıdaki komutu kullanabilirsiniz:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
ancak dosyaları da birlikte dizinleri silmek istiyorsanız, o zaman bunu kullanabilirsiniz:
$ find . ! -name "*.txt" -exec rm -r {} \;
Ters grep ve xargs kullanabilirsiniz
ls | grep -v .txt$| xargs rm
ls | grep -v *.txt | xargs rmaynı şekilde çalışır
grep -v *.txtyalnızca tam olarak bir .txtdosya varsa çalışır . Yok ise, desen olarak grepkullanacaktır *.txt; birden fazla varsa, diğer .txtdosyaların içindeki ilk dosya adını arayacak ve çıktıyı görmezden gelecek ls. (Kesin sonuçlar kabuğun glob seçeneklerine bağlı olabilir.)
.txt$txtnoktadan bağımsız olarak biten karakter dizileriyle eşleşir . Çünkü grepnormal ifadeyi parametre olarak alır. Yani dosyalar a.txtve aatxtve a-txttüm bu ifadesinin eşleştiği edilecektir. Doğru ifade olmalı ls | grep -v \\.txt$ | xargs --no-run-if-empty rm. Meraklı insanlar için: İfade ile oynamak istiyorsanız, bu test ifadesini güvenle kullanın ls | grep \\.txt$ | xargs --no-run-if-empty echo(not: -vbayrak yok ve rm=>echo). Not2: Çift ters eğik çizgi görmüş olabilirsiniz. Biri regex içindir, diğeri bash'ın eğik çizgiden kaçması içindir.
Basitçe yapın:
rm $(ls -I "*.txt" ) # * .Txt dışında dosya türünü siler
Aynı şekilde, "bir veya daha fazla dosya türü hariç" silmek zorundaysanız, şunları yapın:
rm $(ls -I "*.txt" -I "*.pdf" ) # * .Txt & * .pdf dışındaki dosya türlerini siler
-Iseçenek faydalı olabilir, ancak neden ayrıştırmadığınızı görün . Ve ne başarır | xargs? Herhangi bir argüman olmadan, sadece echotüm girdilerle çalışır .
xargsbaşarması gerekiyor?
Bu ayrıca belirtilen ( ) dışındaki tüm gizli (nokta) dosya ve klasörleri kaldırmak için de çalışır .mydir:
rm -rf $(ls -aI ".mydir")
lsaslında aramaya başlamadan önce olduğu gibi zararsız bir komutla test edinrm.