Dizinleri değil tüm dosyaları silme komutu nedir?


23

Diyelim ki böyle bir dizin ağacım var:

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2

Ben kullandıysanız rm -r FOLDER/*, klasöründeki her şeyi alt dizinleri dahil silinir. FOLDER ve alt dizinlerindeki tüm dosyaları gerçek dizinleri silmeden nasıl silebilirim?

Yanıtlar:


37

Yapmaya çalıştığın şey özyinelemeli silme. Bunun için gibi özyinelemeli bir araca ihtiyacınız var find.

find FOLDER -type f -delete

13

İle bash:

shopt -s globstar  ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done

Burada, genişletilmiş dosya adlarını yinelemek ve yalnızca dosyaları silmek.

Yukarıdakiler kuru çalışmadır, yapılacak değişikliklerden memnun kaldıysanız echo, fiili temizleme için kaldırın :

for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done

Sonunda, set globstar:

shopt -u globstar

zshGlob niteleyici kaldıraç ile :

echo -- FOLDER/**/*(.)

(.) glob niteleyicisi, glob açılımlarını sadece normal dosyalarla sınırlar.

Yukarıdakiler, asıl kaldırma için sadece dosya adlarını basacaktır:

rm -- FOLDER/**/*(.)

2
Zsh globbing için +1. Daha fazla insan, zsh'nin yapabileceği harika şeylerin farkında olmalıdır.
mart

11

Sürümünüz finddesteklemiyorsa -delete, geçerli dizindeki ve altındaki her dosyayı silmek için aşağıdakileri kullanabilirsiniz.

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

-exec rm {} +özellikle çok sayıda dosya varsa daha hızlı olur.
muru

Ayrıca find . ! -type d -exec rm {} +sym linklerini de kaldırır.
DK Bose

1
@muru: Belirli bir uygulaması finddesteklemiyorsa -delete, muhtemelen de desteklememektedir -exec ... {} +. Bununla başa çıkmanın önerilen yolu find ... -print0 | xargs -r0 rm(eğer bir çok potansiyel eşleşme bekleniyorsa).
David Foerster

5
@DavidFoerster gerçekten değil. -exec ... {} +POSIX, ancak -deletedeğil. ( -print0Bu arada, ikisi de değil .)
muru,

@muru: Yeterince adil. findDestekleyen -print0ancak desteklemeyen en az iki POSIX dışı uygulama ile karşılaştım -exec ... {} +( -deleteolsa da hatırlamıyorum ). Biri OS X’de, diğeri Solaris’te (birkaç yıl önce muhafazakarca güncellenen bir sistemde) vardı. Ayrıca ikame edebilir -print0ile -printf '%p\0'. Neyse, bu Ask Ubuntu ve Unix ve Linux değil ve Ubuntu sonsuza dek GNU bulma özelliğini kullanıyor.
David Foerster
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.