Yalnızca dizinlerin içeriği nasıl kaldırılır?


14

Ben bir klasörde değilim: /var/myfolder.

İçinde bazı klasörler var: /var/myfolder/A/ /var/myfolder/B/ `/var/myfolder/C/vb.

Her birinin içinde rastgele isimleri olan bazı dosyalar var. İçindeki tüm klasörlerden tüm dosyaları nasıl silebilirim /var/myfolder?

Yapı (içerideki tüm dizinler, örn., A, B, C vb. /var/myfolder) Bozulmadan kalmalıdır.

Yanıtlar:


17

Deneyin:

find /var/myfolder -type f -delete

Bu, / var / myfolder altındaki tüm normal dosyaları alır ve yalnızca dizinleri bırakarak siler.


Çözüm için teşekkürler. Bunu Solaris 9'da yaptığımı belirtmeliyim, bu yüzden bulmamın -delete seçeneği yok, ama bu iyi bir başlangıç ​​noktası.
IroeN

2
Aşağıdaki bir çözüm buldum: find / var / myfolder -type f -exec rm -f {} \;
IroeN

2
Afedersiniz. Debian veya Ubuntu kullanıyorum. Çözümünüz bildiğim kadarıyla eşdeğerdir.
StarNamer

6
-type f! =! -type d
mikeserv

7

Zsh ile . glob niteleyicisini yalnızca normal dosyaları eşleştirmek için kullanın :

rm -- **/*(.)

Bu, geçerli dizindeki ve alt dizinlerindeki tüm (gizli olmayan) normal dosyaları tekrar tekrar siler. DGizli normal dosyaları (ve gizli dizinlerdeki normal dosyaları) silmek için glob niteleyicisini ekleyin .


Ben bash kullanıyorum.
IroeN

1
@ user6554: ... ne sorunuz ne de kullanılan etiketler göstermiyor;)
0xC0000022L


3
find . -depth -exec rm {} + 2>/dev/null

rm dizinleri kaldırmaz - bu yüzden her şeyi çalıştırın.

Dizinlere sembolik bağlantıları korumak için:

find .  ! -type d -exec sh -c '
    for f do [ -d  "$f" ] || 
          set "$@" "$f";  shift
    done; rm  "$@"' sh  {} +

Ve yukarıdaki sürümde test edilmesi gerekebilecek çok fazla dosya varsa, belki de biraz optimize edilmiş bir şekilde çalışması gerektiğini düşünüyorum :

find . ! \( -type l -o -type d \)  \
-exec  rm {} + -o -exec  sh -c '
       for f do [ -d "$f" ] ||
       unlink "$f";done' sh {} +

GNU'nun findbunun için bir -xtypeseçeneği olduğunu unutmayın.
Stéphane Chazelas

@ StéphaneChazelas - ast da yapıyor. ama hiç derinliğe ihtiyacım yoktu, sanmıyorum. Ben çok fazla hata çağrıları - susturulmuş ya da değil - önlemek için üst bir tuttu ama diğerlerinde sadece aptalca oldu.
mikeserv

1
# This will delete all directory contents, including hidden files and
# subdirectories, without deleting the directory itself

# With GNU find:
find /path/to/directoryToEmpty -mindepth 1 -delete

# OpenBSD (and probably other BSDs)
find /path/to/directoryToEmpty -mindepth 1 -depth -exec rm -f {} \;

# To see what it deletes, in the order it will delete it:
find /path/to/directoryToEmpty -mindepth 1 -depth -print

0
rm var/myfolder/*/*

Alt klasörlerin kendilerine dokunmadan alt klasörlerin içindeki her şeyi silecektir.

İlk *alt dizinleri içindir myfolderkendisi ( A, B, ...). İkinci *dosyalar içindir A, Bvb

Daha klasörler içeride vardır EĞER A, Bvb Birinci çalıştırma: rm /var/myfolder/*/*/*o zaman koşmak rm /var/myfolder/*/*.


0

Ayrıca, söz konusu dizin ağacının en üstüne cd yazıp sonra da çalıştırabilmeniz gerekir:

find . -type f -print0 | xargs -0 rm -rf

ve dizin ağacını olduğu gibi bırakarak tüm dosyaları silmelidir. Boşluk içeren dosya veya dizin adlarınızın olmadığından eminseniz -print0 ve -0 seçenekleri atlanabilir.

Find komutu dosyalar (-type f) ve linkler (-type l) arasında ayrım yapar, bu nedenle varsa bağlantıları olduğu gibi bırakmalıdır. Yine de test edilmedi. Şüpheniz varsa, çalıştırın:

bulmak. -tip l

ve önceki find komutunu çalıştırmadan önce bir şey görünüp görünmediğine bakın.


rmBayrağın buna nasıl -r, -R, --recursive - remove directories and their contents recursivelyuyduğunu açıklayabilir misiniz ?
Stephen Rauch

Çünkü rm -rf çalıştırmıyoruz, find çalıştırıyoruz. -f tipi ve daha sonra çıktıyı rm'ye -rf'ye pipolayın. Bu yüzden sadece dosyaları kaldırır, dizinlere dokunmaz. İşte bu | xargs bit yapar, çıktıyı soldaki komuttan alır ve sağdaki komuta gönderir.
rjh427

Demek istediğim. Herhangi bir dizini geçmiyorsanız, sadece dizinlerde çalışan bir bayrak ne işe yarar?
Stephen Rauch

Çünkü kas hafızası ve hala çalışıyor. Aynı itirazı -f "kuvvet" seçeneğinde de dile getirebilirsiniz, size aynı cevabı veririm.
rjh427

-2

Aşağıdaki komutu kullanmanız yeterlidir:

sudo rm -rf dizini_in_which_you_have_content / *

---------------- VEYA --------------------------------- -----------------------

'*' Herkesi temsil eder, bu nedenle * 'i ne zaman kullanacağınız tüm içeriği siler. bu nedenle ya bu komutu kullanın ya da tüm içeriği silmek istediğiniz dizine gidin ve aşağıdaki komutu kullanın:

sudo 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.