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
-delete
hem de dosyaların kaydedileceği şey tarafından çıkarılması -delete
ve \!
.
find
özyinelemeli! yani ' desen ' ile eşleşmeyen tüm alt dizinler de silinir
İle, zsh kullanarak setopt EXTENDED_GLOB
kullanarak, ~
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, extglob
istediğ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 rm
ile 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
, b
ve a b
ilk program siler - Eğer grep parçası haline ab koyarsanız: "^[ab]$"
a
ve b
ancak 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 $HOME
da 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 -delete
bu sorunu çözmenin bir yoludur.
tmp
yoksa da silinecektir . X
Y
Z
!
-not
-delete