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)
?
rm
varsa ve klasör olsaydı boğulacak gibi olur.
find . -type f ! -name "*.txt" | xargs -r rm
GNU \ 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 rm
aynı şekilde çalışır
grep -v *.txt
yalnızca tam olarak bir .txt
dosya varsa çalışır . Yok ise, desen olarak grep
kullanacaktır *.txt
; birden fazla varsa, diğer .txt
dosyaları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$
txt
noktadan bağımsız olarak biten karakter dizileriyle eşleşir . Çünkü grep
normal ifadeyi parametre olarak alır. Yani dosyalar a.txt
ve aatxt
ve a-txt
tü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: -v
bayrak 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
-I
seç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 echo
tüm girdilerle çalışır .
xargs
baş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")
ls
aslında aramaya başlamadan önce olduğu gibi zararsız bir komutla test edinrm
.