Yalnızca dosya nasıl silinir, ancak dizin yapısı nasıl korunur?


17

Her dosyayı silmek istiyorum, ancak klasör yapısını koruyorum. Bir yolu var mı?

NOT: (GNU bash 4.1.5 kullanıyorum).


1
Tam olarak "hariç tutmak" ne demek istiyorsun? Bir çeşit komut mu kullanıyorsunuz? Öyleyse, lütfen bunu eklemek için sorunuzu güncelleyin.
slm


Her dosyayı silmek istediğini düşünüyorum.
slm

1
@slm Genellikle dosyaları hariç tutmak için kullandığım komutla güncelledim.
Tom Brito

Hayır değil :-) Veya, eğer yaptıysanız, tekrar kaldırdınız
Mawg, Monica'yı

Yanıtlar:


19

Bunu dene:

find . ! -type d -exec rm '{}' \;

Bu işlem, geçerli çalışma dizininin altındaki dizinler hariç her bir dosyayı siler. Bu komutla son derece dikkatli olun.

Makinenizdeki sürümü finddestekliyorsa,

find . ! -type d -delete

@slm: Ne kadar taşınabilir olduğundan emin değilim. İkincil bir seçenek olarak ekledim. Düzenlememin cevabımı seninkiyle hemen hemen aynı yaptığını fark ettim. Bunun için üzgünüm; niyetim bu değildi.

'{}' Dosyalardaki boşluklara karşı koruma sağlıyor mu? Her zaman kullandığınızı görüyorum ve onunla çözümler gönderdiğinizi görmeden önce kullanıldığını hiç sanmıyorum.
slm

GNU find manpage'den: " Parantezlerin kabuk komut dosyası noktalama işareti olarak yorumlanmasını önlemek için tek tırnak işaretleri içine alındığına dikkat edin." Yine de ne zaman gerekli olduğundan emin değilim. Çoğunlukla alışkanlığım dışında yapıyorum. findKomut asla tırnak işareti görür. Sadece {}işaretçiyi bir argüman olarak görür .

Örnekte görüyorum, ancak şablonlar bunu gösteriyor " -exec command {} +" ve bu " -exec command ;". \;Geçmişte hiç kullanmadım '{}'.
slm

@slm: Şablonlar aynı zamanda noktalı virgülden kaçmayı da göstermez; bu genellikle yürütmek için bir kabuk kullanılırken gereklidir find. Bence şablonlar findkomutun hangi argümanlara ihtiyaç duyduğunu ve kabukla ilgili herhangi bir şey hakkında endişelenmemenizi amaçlıyor.


1

Geçerli dizindeki ve alt dizinlerdeki her normal dosyayı tekrar tekrar silmenin kolay yolu:

zsh -c 'rm **/*(.)'

Yalnızca zsh, dosyaları türe göre eşleştirmek için globbing niteleyicilerine sahiptir . Ancak, rmkomut dizinlerde çalışmaz, bu yüzden bash'ta

shopt -s globstar
rm **/*

Bu, diğer komutlar için geçerli değildir rm. Genel olarak şunları kullanabilirsiniz find:

find . -type f -delete

ya da finddesteklemiyorsa -delete:

find . -type f -exec rm {} +

-2

Ben dizin yapısını silme ile bir yol ve alt dizinleri (zamana göre filtreleme) dosyaları silmek için benzer bir gereklilik vardı.

Ve benim için çalışan aşağıdaki biçimi kullandım.

find / test123 / home / test_file_hip / data / nfs -mtime +6 -tip f -exec rm {} \;

Syntex: find (dosya yolu) -mtime (günden fazla veya daha az) -type f -exec rm {} \;

-type: "d" dizini için "f" dosya türünden bahseder -exec: execute komutu rm: remove {}: find komutunun çıktısı

Not: Kullanmadan önce test edin. Bir şey kaçırırsam lütfen düzeltmek veya güncellemek için çekinmeyin.


1
Bu, OP tarafından belirtilmeyen ek bir gereklilik olduğundan ve temel find ... rmyapı zaten ele alındığından, bunun bu soruya yeni bir Cevap olarak değerli bir katkı olduğundan emin değilim.
Jeff Schaller
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.