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 u
ve 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 u
ve 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 rm
tüm ama u,p
bash 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 -rf
komutunuzdaki 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 1
bulma işlemini yalnızca belirtilen dizini gerçekleştirir ( find
varsayı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
-delete
hemen sonra .
çıkarsa (CWD'deki tüm dosyaları silecektir)
find . -maxdepth 1 -type f -name '[^up]' -delete
find
en iyi arkadaşım, özellikle glob için çok fazla dosya varken
Basit:
mv
İstediğiniz dosyaları bir üst dizinde, rm
dizinde ve sonra mv
onları geri.
rm
olmadan -r
alt 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.
-E
ya daegrep
u
veya a içeren dosyaları hariç tutacaktırp
grep -L (u|p)' * | xargs rm
nerede -L
liste bir maç içermeyen filenames gelir.
u
veya p
a u
veya 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 u
ve p
bu örnekte simdiki içinde. Bu komut dosyaları için kullanışlı olabilir.
find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
-regextype
sadece GNU versiyonlarında çalışacak
find
GNU find
komut uzantısıdır . Aynısı -regextype
seç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 rm
sizden 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