Sadece bazı belirtilen dosyaları terk ederken bir dizindeki tüm dosyaları kaldırmak istiyorum, adlarıyla ortak bir şey yok. Bunu nasıl başarabilirim?
Örneğin, saklamak istediğim dosya adları:
file_1.png
, another_file.jpg
,some_music.mp3
Sadece bazı belirtilen dosyaları terk ederken bir dizindeki tüm dosyaları kaldırmak istiyorum, adlarıyla ortak bir şey yok. Bunu nasıl başarabilirim?
Örneğin, saklamak istediğim dosya adları:
file_1.png
, another_file.jpg
,some_music.mp3
Yanıtlar:
Eğer bash kullanıyorsanız:
shopt -s extglob
rm -- !(file1|file2|file3)
İlk satır sadece genişletilmiş desen eşleşmesini etkinleştirir ve bundan sonra bunlardan birini kullanırız:
!(pattern-list)
verilen kalıplardan biri dışındaki herhangi bir şeyle eşleşir
ve desen listesi, a ile ayrılmış bir veya daha fazla desenin listesidir |
.
Veya ile zsh
setopt extendedglob
rm -- ^(file1|file2)
Ya da, daha taşınabilir find
:
find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +
Bir alt dizin oluşturun tmp
, saklamak istediğiniz tüm dosyaları bu dizine taşıyın ve rm -f *
daha sonra yapın. Bu tmp
dizini etkilemez .
Bundan sonra sadece yapın:
mv tmp/* .
rmdir tmp
(Taşıdığınız dosyaların hiçbirinin bir nokta ile başlamadığını varsayarsak).
Bu, fareyi ve Nautilus gibi bir dosya tarayıcısını kullanmanın mantıklı olduğu birkaç durumdan biridir, burada Ctrltutmak istediğiniz birkaç dosyayı tıklatabilir ve ardından menüyü kullanabilirsiniz: Edit -> Invert Selection
diğer dosyaları almak ve daha sonra bunları silmek için .
ls
korumak istediğiniz dosyalardan herhangi birini kaçırıp kaçırmadığınızı görmek için bir komutunu kullanabilirsiniz.
Saklamak istediğiniz dosyaların adlarını her satıra bir metin dosyasına ekleyin. Bu dosya dizinde olmamalı veya adını da eklemelisiniz.
Senin dizinin adı ise foo ve dosyanın adıdır çubuk şunu yapın.
find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm
Bu aşağıdakileri yapar:
find -type f
foo ve alt dizinlerindeki tüm dosyaların adlarını arar ve STDOUT'a yazdırır. Seçenek ile -print0
dosya adlarını NUL baytları ile sınırlar.grep -v -f bar
çubuktaki bir satırla eşleşen tüm dosya adlarını hariç tutar . Seçeneği ile -z
, girdisini NUL -Z
baytıyla sınırlandırılmış bir dizi satır olarak ele alır, seçeneği ile çıkışını bir NUL baytıyla sınırlar.xargs rm
rm
dosyaları silmek için art arda çağırır . Opsiyon ile -0
, girdisini NUL baytı tarafından sınırlanan bir dizi satır olarak ele alır.Bu, boşluk içeren dosya adlarıyla çalışır.
find
find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
shopt -u extglob
).