Dize içeren tüm dosyaları silmek istiyorum foo
. Linux'ta bash kullanarak bunu nasıl yapabilirim?
foo
(örn. myfoo.jpg
) Veya bayt sırasını içeren dosyaları foo
(bu bayt sırasını içeren ikili dosyaları içerebilir) silmek istiyor musunuz?
Dize içeren tüm dosyaları silmek istiyorum foo
. Linux'ta bash kullanarak bunu nasıl yapabilirim?
foo
(örn. myfoo.jpg
) Veya bayt sırasını içeren dosyaları foo
(bu bayt sırasını içeren ikili dosyaları içerebilir) silmek istiyor musunuz?
Yanıtlar:
İşte güvenli bir yol:
grep -lrIZ foo . | xargs -0 rm -f --
-l
arama modeliyle eşleşen dosyaların dosya adlarını yazdırır.-r
foo
verilen dizindeki desen için özyinelemeli arama yapar .
. Bu işe yaramazsa, deneyin -R
.-I
(büyük harf i
) PDF gibi ikili dosyaların atlanmasına neden olur.-Z
dosya adlarının sıfır (yani nul) olarak sonlandırılmasını sağlar, böylece beyaz boşluk içeren bir ad yanlış şekilde yorumlanmaz (yani bir yerine birden çok ad olarak).xargs -0
dosya isimleri beslemeleri grep
için rm -f
sıfır (nul) tarafından ayıran bir deyişle, bayt (hatırlamak -Z
seçeneğini grep
).--
genellikle unutulur, ancak seçeneklerin sonunu işaretlemek ve adları ile başlayan dosyaların kaldırılmasına izin vermek çok önemlidir -
.Hangi dosyaların silinmek üzere olduğunu görmek istiyorsanız, | xargs -0 rm -f --
parçayı kaldırın ve Z
seçeneğini bırakın grep
.
Başka bir kullanıcı , güvensiz olduğu için çalıştırmamanız gereken aşağıdaki gibi bir şey önerdi :
files=`grep foo * | cut -d: -f1`
rm -f $files # unsafe, do not run it!
ImportantStuff
Silmek ve obsolete ImportantStuff
içermediğim dosyalarım varsa foo
, bu komutu çalıştırdığımda kaybederim ImportantStuff
(ve değilim obsolete ImportantStuff
!), Çünkü $files
yorumlandığında boşluklarda parçalanır. Bu şekilde skaler kabuk değişkenine bir dosya adı listesi koymak tehlikelidir.
$ find -type f -exec grep -q "foo" {} \; -exec echo rm -- {} \;
Bu, tekrarlayan dosyaları içeren dosyaları arar foo
. İkincisi -exec
sadece ilk exec
başarılı bir şekilde çıkarsa, yani eşleşirse çalıştırılır grep
. Çıkışı echo
doğru görünüyorsa kurutun ve çıkarın .
Veya alternatif olarak
$ find -type f -exec grep -q "foo" {} \; -print
ve
$ find -type f -exec grep -q "foo" {} \; -delete
Lekensteyn tarafından önerildiği gibi.
find -type f -exec grep -q 'foo' {} \; -delete
(tırnak işaretleri {}
gereksizdir, find
ayrıca dosyaları silebilir.). grep
Normal bir ifadeyi kabul ettiğini unutmayın . Aramak istiyorsanız foo.bar
, ya bundan kaçın ya -F
da kalıbı gerçek olarak kabul etme seçeneğini iletin.
-exec echo rm "{}" \;
değil -delete
mi?
-delete
. İkincisi -exec
ve yankı yerinde iken göstermek daha kolaydır .
-print
(veya -ls
daha fazla ayrıntı için) daha kolaydır -exec echo rm "{}" \'
. Harici yardımcı programlara gerek yoktur.
Adrian'ın söylediklerini yaparım,
Ama "gıda" içeren dosyaları yanlışlıkla silmemek için foo etrafına kelime sınırları eklerdim (yiyecek içeren her şeyi silmediğiniz sürece.)
$ find -type f -exec grep -q "\<foo\>" {} \; -delete
acutally, ben silmeden önce gözden olabilir böylece silmeden önce çıktı yönlendirirsiniz:
$ find -type f -exec grep -q "\<foo\>" > /tmp/list_of_files_to_delete