Yanıtlar:
Bunun yerine rm kullanımında nedeniyle, kullanımı daha kolay olabilir bulmak . Bunun gibi bir komut, tam olarak 'dosya' adlı bir dosya hariç her şeyi siler
find . \! -name 'file' -delete
Birçok sürümü globbing ve düzenli ifade eşleşmesini destekleyebilmelidir.
Ayrıca find çıktısını rm'ye de ekleyebilirsiniz.
find . \! -name '*pattern*' -print0 | xargs --null rm
-deletehem de dosyaların kaydedileceği şey tarafından çıkarılması -deleteve \!.
findözyinelemeli! yani ' desen ' ile eşleşmeyen tüm alt dizinler de silinir
İle, zsh kullanarak setopt EXTENDED_GLOBkullanarak, ~operatör ( hariç )
rm -- *~(x|y|z)
veya ^operatör (olumsuzlama):
rm -- ^(x|y|z)
Ancak, muhtemelen dosyaları başka bir yere taşımalısınız, ardından her şeyi silmelisiniz. Çok kısa sürede girmek gibi parmak kaymaları açısından çok daha güvenlidir.
Bash'ın sonraki sürümlerinde, extglobistediğiniz şeyi yapmak için size bir sözdizimi sağlayan kabuk seçeneği vardır (yüklü sürümünüzde olup olmadığını görmek için "Yol Adı Genişletme" altındaki man sayfanızı kontrol edin):
$ shopt -s extglob # turn on extended globbing
$ rm !(X|Y|Z)
Test etmek için, önce silinecek dosya listesinin beklediğiniz gibi olup olmadığını görmek için rmile değiştirmenizi öneririz echo.
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r
Uyarı: Komutu çalıştırın ve silinecek dosyalar doğruysa, tekrar çalıştırın ve "#" karma karakterini silin.
Dosya adları bundan daha karmaşıksa,
ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r
Yine, önce sonuçlara bakın, ardından karma işaretini kaldırın.
Bu sürüm - yorumlarda belirtildiği gibi - bazı karakterleri kaydeder ve biraz daha net görünür.
ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r
a, bve a bilk program siler - Eğer grep parçası haline ab koyarsanız: "^[ab]$" ave bancak a b, sadece niyetlerine karşı çıktı. İkinci komut da aynısını yapacak. Üçüncüsü de. Çok, çok nadir istisnalar dışında, komut dosyalarında 'ls' kullanmamalısınız. Sadece yapma.
Saklamak istediğiniz dosyaları uzaklaştırın. Bir seviye yukarı git, klasörü sil. Klasörü yeniden oluşturun ve bu dosyaları geri taşıyın.
/, heh? Çok pratik değil. c) Bilgisayarınızdaki tüm dosyaları kaldırmaya çalışmak $HOMEda pratik değildir.
Bu bir OSX / MacOS çıkış kancası için bir .sh komut dosyası olarak ayarladığım şey, yeterince iyi çalışıyor.
#! /bin/bash
for dir in /PathToFolder/*
do
if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then
echo ${dir}
sudo rm -R $dir user
dscl . -delete $dir
fi
done
exit 0
GNU-find ile, boşsa dizinleri de kaldıran -delete anahtarını kullanabilirsiniz:
find tmp -not -name X -not -name Y -not -name Z -delete
find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -deletebu sorunu çözmenin bir yoludur.
tmpyoksa da silinecektir . XYZ!-not-delete