İlk üst dizini değil alt dizinleri ve dosyaları yinelemeli olarak nasıl kaldırabilirim?


14

Hedef dizini ve tüm alt dizinlerini ve içeriğini yinelemeli olarak kaldırmak için aşağıdakileri kullanabilirim.

find '/target/directory/' -type d -name '*' -print0 | xargs -0 rm -rf

Ancak, hedef dizinin kaldırılmasını istemiyorum. Yalnızca hedefteki dosyaları, alt dizinleri ve içeriklerini nasıl kaldırabilirim?

Yanıtlar:


12

Önceki cevap neredeyse doğrudur. Ancak, kabuk glob karakterlerinin çalışmasını istiyorsanız alıntı yapmamalısınız . Yani, aradığınız komut budur:

rm -rf "/target/directory with spaces/"*

* İfadesinin çift tırnak işaretleri dışında olduğunu unutmayın. Bu form da işe yarar:

rm -rf /target/directory\ with\ spaces/*

Eğer varsa *yukarıda gösterildiği gibi tırnak içinde, o zaman sadece anlamıyla adlı tek bir dosya çıkarmak için çalışacaktır *hedef dizin içinde.


1
Bu, gizli dosya ve klasörlerle çalışmaz. Bir kez daha bunu yapmak zorunda kaldım
The Unfun Cat

8

Üç seçenek daha.

  1. Kullanım findile -mindepth 1ve -delete:

    İndemindepth seviyeleri
    Düzeylerden daha düşük düzeylerde (negatif olmayan bir tam sayı) herhangi bir test veya eylem uygulamayın.
    İndemindepth 1, komut satırı bağımsız değişkenleri dışındaki tüm dosyaları işlemek anlamına gelir.

    -delete
    Dosyaları sil; kaldırma işlemi başarılı olursa true. Kaldırma işlemi başarısız olduysa bir hata mesajı verilir. Eldelete başarısız olursa, find öğesinin çıkış durumu sıfırdan farklı olur (sonunda çıktığında). Eldelete kullanımı otomatik olarak −depth seçeneğini açar.
    Bu seçeneği kullanmadan önce -depth seçeneği ile dikkatlice test edin.

    # optimal?
    # -xdev      don't follow links to other filesystems
    find '/target/dir with spaces/' -xdev -mindepth 1 -delete
    
    # Sergey's version
    # -xdev      don't follow links to other filesystems
    # -depth    process depth-first not breadth-first
    find '/target/dir with spaces/' -xdev -depth -mindepth1 -exec rm -rf {} \;
    



2. findDizinlerle değil dosyalarla kullanın . Bu, aşağıdakileri yapma ihtiyacını ortadan kaldırır rm -rf:

    # delete all the files;
    find '/target/dir with spaces/' -type f -exec rm {} \;

    # then get all the dirs but parent
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -exec rmdir {} \;

    # near-equivalent, slightly easier for new users to remember
    find '/target/dir with spaces/' -type f -print0 | xargs -0 rm
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -print0 | xargs -0 rmdir



3. Devam edin ve üst dizini kaldırın, ancak yeniden oluşturun. Bunu tek bir komutla yapmak için bir bash işlevi oluşturabilirsiniz; İşte basit bir astar:

    rm -rf '/target/dir with spaces' ; mkdir '/target/dir with spaces'

2

Peki ya

rm -rf /target/directory\ path/*

İle başlayan dosyalar olabilir. hedef dizinde.

rm -rf "/target/directory path/*" "/target/directory path/.??*"

Bu saniye,. İle başlayan her şeyle eşleşir. ve .. .a gibi isimlerde başarısız olacak, ama bu çok yaygın değil. Gerekirse tüm davaları kapsayabilir.


İkisini de denedim ve benim için çalışmıyorlar. Belki de bunun nedeni hedef dizin yolumun içinde boşluk bulunmasıdır? rm -rf '/ target / dizin yolu / *' Hata vermez, ancak alt dizinler kalır.
Michael Prescott

Boşluktan önce bir ters eğik çizgi (\) ile veya tüm dizin adını tırnak işaretleri içine alarak (")
boşluklardan kaçmanız

Teşekkürler, önceki yorumumda gösterildiği gibi denedim ve hala gitmek yok. (OS X kullanıyorum, önemli mi?)
Michael Prescott

OS X iyi çalışmalı, bunu kullanıyorum. Hem ters eğik çizgi hem de tırnak işareti kullanmadığınızdan emin olun. Sadece biri ya da diğeri.
KeithB

Evet, sadece tırnak işaretlerini kullanarak. Ben * kaldırmak ve bu yüzden sadece rm -rf "/ target / directory path /" kullanıyorum "dizin yolu" dizini "dizin yolu" alt dizinleri ile birlikte kaldırılır. Eğer rm -rf "/ target / directory path / *" kullanırsam hiçbir şey olmaz.
Michael Prescott

2
find /target/directory/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;
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.