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.