Bir dizindeki tüm dosyaları silmem gerekiyor, ancak bazılarını hariç tutmam gerekiyor. Örneğin, dosyaları ile bir dizindeki a b c ... z, tüm haricinde silmenize gerek uve p. Bunu yapmanın kolay bir yolu var mı?
Bir dizindeki tüm dosyaları silmem gerekiyor, ancak bazılarını hariç tutmam gerekiyor. Örneğin, dosyaları ile bir dizindeki a b c ... z, tüm haricinde silmenize gerek uve p. Bunu yapmanın kolay bir yolu var mı?
Yanıtlar:
Bu durumlarda ne yapacağım yazmaktır.
rm *
Sonra basın Ctrl+ X, *için genişletmek * tüm görünür dosya adları içine.
Sonra listeden saklamak istediğim iki dosyayı kaldırabilir ve sonunda komut satırını çalıştırabilirim.
*genişleyen dosyaların listesi de fazla uzun olmadıkça çalışır. : -}
Ctrl+ Shift+ x+*
To rmtüm ama u,pbash hemen yazın:
rm !(u|p)
Bu, aşağıdaki seçenek ayarlanmasını gerektirir:
shopt -s extglob
Daha fazlasını görün: glob - Greg's Wiki
shopt -s extglob, @Shot. Ayrıca, dizin değil sadece dosya, bu yüzden -rfkomutunuzdaki seçenekleri kaldırdım .
rm !(index).html. Bu, "index.html" dışında ".html" ile biten tüm dosyaları siler.
Kullanabilirsiniz find
find . ! -name u ! -name p -maxdepth 1 -type f -delete
! sonraki ifadeyi olumsuzlar-name dosya adını belirtir-maxdepth 1bulma işlemini yalnızca belirtilen dizini gerçekleştirir ( findvarsayılan olarak dizinleri değiştirir)-type f yalnızca dosyaları işleyecektir (örneğin, dizinleri değil)-delete dosyaları silecekArdından bulduğunuz man sayfasına bakarak koşulları ayarlayabilirsiniz.
Güncelleme
İlk önce komutunuzu kullanarak komutunuzu test edin -print.-delete
find . ! -name u ! -name p -maxdepth 1 -type f -print-deletehemen sonra .çıkarsa (CWD'deki tüm dosyaları silecektir)
find . -maxdepth 1 -type f -name '[^up]' -delete
finden iyi arkadaşım, özellikle glob için çok fazla dosya varken
Basit:
mvİstediğiniz dosyaları bir üst dizinde, rmdizinde ve sonra mvonları geri.
rmolmadan -ralt dizinleri kaldırmaz.
Bu cevaba biraz benzemekle birlikte, özel bir seçeneğe ihtiyaç duyulmuyor, bildiğim kadarıyla aşağıdaki gibi herhangi bir (belli belirsiz) / bin / sh gibi kabuk (ör. Bash, zsh, ksh, vb.) Tarafından desteklenen "eski" işlevler.
rm [^up]
rm [^up]*? Sık sık benzer şeyler yapıyorum.
Bulmadan yapmak:
ls | grep -v '(u|p)' | xargs rm
(Düzenleme: "u" ve "v", buradaki diğer yerlerde olduğu gibi, tüm regex'lerin genel sürümleri olarak kullanılıyor. Açıkçası, regex'lerinizi çok fazla eşleştirmekten kaçınmak için dikkatli tutmak isteyeceksiniz.)
Diğerlerinin önerdiği gibi, bunun çoğunu yapacaksanız, kesinlikle bir senaryo isteyeceksiniz.
-Eya daegrep
uveya a içeren dosyaları hariç tutacaktırp
grep -L (u|p)' * | xargs rmnerede -Lliste bir maç içermeyen filenames gelir.
uveya pa uveya a içeren hiçbir dosya içermeyen herhangi bir dosyayı kastediyorsunuz p. Bu doğru. Aşağıdakileri kullanarak düzeltebilirsinizegrep -v '^(u|p)$'
ls | grep -v 'vuze\|progs' | xargs rm -rf
Disket çağında, "Geçici" olarak adlandırılan ve geçici olarak olayları geçerli dizinden çıkaran ve bir komutu yürüten bir çalıştırılabilir dosya vardı.
hariç * .txt del *. *
Metin dosyalarınız dışındaki her şeyi silmek için.
Bu, bir kabuk betiği olarak uygulamak için oldukça önemsiz bir şey olurdu ve eğer bu iki katından fazla yapabileceğiniz bir şeyse, iyi bir fikir gibi görünüyor.
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;
Bu, unix içindeki p ve p dışındaki tüm dosyaları siler.
Tam karmaşık regexp emacs, posix-awk veya posix genişletilmiş stilde (etkilenen tüm dosya adlarını kapsayan) rasgele karmaşık dışlama desenleri belirtmeyi tercih edenler için, bunu tavsiye ederim. Bu dışlar uve pbu örnekte simdiki içinde. Bu komut dosyaları için kullanışlı olabilir.
find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
-regextypesadece GNU versiyonlarında çalışacak
findGNU findkomut uzantısıdır . Aynısı -regextypeseçenek için de geçerlidir . Ek olarak, komutunuz alt dizinlerdeki dosyaları da silerken, asıl soru açıkça bir dizindeki dosyalar hakkında sorulur.
Yine bir başka:
for FILE in ./*; do if [[ $FILE != ./u* ]] || [[ $FILE != ./p* ]];then rm $FILE; fi; done;
Bu biraz uzundur ve kolayca, kolayca ve argümanlı sayıda argüman barındırabilen bir fonksiyon haline getirip getiremeyeceğinizi bilmiyorum, ama iyi çalışıyor.
Ve saf bash iyiliği var.
İşte başka bir değişken. Yazabilirsin:
rm -i *
veya:
rm --interactive *
Bu yüzden rmsizden her dosyanın silinmesini onaylamanızı isteyecektir.
kullanın:
find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
Dizinler dahil tüm dosyaları silmek için, u, p ve .ext dosyaları hariç.
Dağılması zor olan basit bir yol: diyelim ki * .pdf hariç her şeyi silmek istediğinizi:
mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp