Tüm alt dizinleri bir dizinden nasıl kaldırabilirim?


51

Bu soru, burada ilettiğim ilk soruya II.

Bir sürü alt dizin, .zip dosyası ve bir alt dizinde bulunmayan diğer rastgele dosyaları içeren bir dizine sahibim.

Tüm alt dizinleri üst dizinden kaldırmak için bir komut satırı komut dosyası istiyorum, ancak tüm zip dosyalarını ve alt dizinlere ait olmayan gevşek dosyaları saklayın. Tüm alt dizinlerin içeriği var, bu yüzden -f komutuyla silmelerini zorlamam gerektiğine inanıyorum.

Temel olarak, ana dizine (veya geçerli dizine) bakan bir komut, içindeki tüm klasörleri siler, ancak bir klasör olmayan veya bir klasör içinde bulunan tüm diğer içerikleri ve dosyaları tutar.

Öğeleri komut satırından silmenin özel dikkat gerektirdiğini biliyorum, ancak uzaktan yedekleme için gerekli tüm önlemleri zaten aldım.

Yanıtlar:


61

BASH'de sondaki eğik çizgiyi kullanabilirsiniz ( herhangi bir POSIX kabuğunda çalışması gerektiğini düşünüyorum ):

rm -R -- */

Not --Tartışmalarınızın seçenekleri ayırır ve tire ile başlayan girişleri kaldırmak için birini sağlayan - Aksi giriş adı ile bir seçenek olarak yorumlanır kabuk tarafından genişlemeden sonra rm(aynı diğer birçok komut satırı uygulamaları için de geçerlidir).

-fYazılabilir olmayan dosyaları silerken onay istemek istemiyorsanız seçeneği ekleyin .

Varsayılan olarak, gizli dizinlerin (adıyla başlayanlar .) yalnız bırakılacağını unutmayın.

Önemli bir uyarı: genişletilmesi, */sonunda tür dizinindeki dosyaları çözen sembolik bağları da içerecektir . Ve rmuygulamaya bağlı olarak, rm -R -- thelink/sadece bağlantı sembolünü siler veya (çoğunda) bağlantılı dizinin içeriğini yinelemeli olarak siler ancak o dizinin kendisini veya sembol bağlantısını silmez .

Eğer kullanıyorsanız zsh, daha iyi bir yaklaşım sadece tür dizinindeki dosyaları seçmek için bir glob niteleyicisini kullanmak olacaktır :

rm -R -- *(/) # or *(D/) to include hidden ones

veya:

rm -R -- *(-/)

dizinlere sembolik bağlantılar eklemek (ancak, bu sefer, genişlemenin /izleri olmadığından, yalnızca tüm rmuygulamalarla kaldırılan sembolik bağlantıdır ).

İle bash, AT & T ksh, yashya zshYapabileceğiniz:

set -- */
rm -R -- "${@%/}"

takip etmek için /.


Güzel! Bu mükemmel çalışıyor. Yapması o kadar kolay değildi. -R vs. -R ile ilgili detaylı bilgi verir misiniz ve bu komutların ne işe yarar? Çok teşekkürler.
Evster

-r, -R, --recursive"Dizinleri akıcı ve içeriklerini kaldırmak" anlamına eş anlamlıdır.
Peterph,

ne - ve * / ne yapabileceğini açıklayabilir misin?
amortisör

6
Ayrıca diyebilirsiniz rm -R ./*/- Ayrıca kısa çizgiler adlarıyla ilgili sorunları da önler.
l0b0

1
Sadece * ve / öğelerinin sırasını değiştirmemeye dikkat edin. rm -R - / *, olmasını istemeyeceğin tamamen farklı bir şey yapar: |
ChrisOdney

13

Joker karaktere ek olarak, bunu yapmak için de kullanabilirsiniz find(en azından GNU bulma):

find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 rm -R

Diğer findsatırlarda olduğu gibi, find -mindepth 1 -maxdepth 1 -type dkaldırılacak dizinlerin listesini görmek için ilk kısmı ( ) çalıştırabilirsiniz .

Daha güvenli bir seçenek şöyle bir şey yapmaktır:

find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 mv -i -t ../to-rm
# or
mv -i -t ../to-rm */
# or
mv -i */ ../to-rm

bunlardan herhangi biri ../to-rm, silmek yerine tüm öğeleri içine taşıyacaktır . İstediğini yaptığını, istediğin rm -Rfdizinde onları doğrula .


"CLI-Çöp Kutusu" için +1 to-rmve findbir nokta ile başlayan dizinleri güzel bir şekilde işler (diğer hantal çıkışlara ek olarak). :)
peterph

Bahşiş için teşekkürler. Silmeden önce ayrı bir dizine geçme fikrini seviyorum. Mac OS X'te Terminal aracılığıyla çalışıyorum ve -mindepth ve -maxdepth komutlarını kullanmak için bir tür GNU paketi kurmam gerekeceğine inanıyorum, değil mi?
Evster

@Evster, Mac OS X'in bunları desteklediğinden emin değil. Fink (hala buralarda mı?) Olan bir keşif kurabilir diye düşünüyorum. Veya bunları atlayabilir ve ardından oluşturulan dosya listesini grep kullanarak filtreleyebilirsiniz. Bu konuda mv seçeneğini kesinlikle kullanın.
derobert

4

Özellikle bu önerilerden bazıları için bir komut dosyası oluşturmak rm -R -- */ve / usr / local / bin klasörünüzde tutmak isteyebilirsiniz ; veya alias~ / .bashrc dosyanızda bir tane oluşturun. Öyle yana öylesine bile tek bir harf ve / veya felaket sonuçlara neden olabileceğini harflerin sırasını - - Bir komutu yanlış yazdığınız ve sisteminizi kırmak kolay bu farklı seçenekleri ve argümanları yazmak zorunda göre biraz daha sağlam bir çözüm olarak hizmet verecek Bu görevi ne zaman gerçekleştirmek istersen.

Ayrıca, istenmeyen silmeleri önlemek için komut dosyası / komutunuza başka bir araç olarak hizmet verecek -i or --interactive=onceveya -I or --interactive=alwaysseçeneğini dahil etmek isteyebilirsiniz .

Ayrıca, derobert'in önerdiği gibi bir şey en iyisi olur; sadece komut dosyasını bir dosyaya / terminal düzenleyiciye kopyalayıp yapıştırın ve özel gereksinimlerinize göre ayarlayın; dosyalar / dizinler tek bir dizine taşınacaktır (içeriği kontrol edip doğrulayabileceğiniz) veren rm -rfkomutu.

Diğer bir seçenek de, dosya yöneticiniz gibi bir GUI uygulaması kullanmak ve silmek istediğiniz tüm uygun dosyaları / klasörleri seçmektir. İzinleriniz yoksa dağıtımınızın manuel sayfalarını kontrol edin.

Son olarak, klasörler boşsa - temelde basit dosya isimleri - rmdirsilmek için komutu kullanabilirsiniz . Silmek isteyebileceğiniz her şey için işe yaramaz, ancak bazı "ev temizliği" yapmak istediğinizde kullanışlı olabilir. ** -p --ignore-fail-on-non-emptyBelirli alt dizinleri ve boş "ebeveynleri" - içinde bulundukları dizinleri silmenizi sağlayacak olan seçeneği denemek isteyebilirsiniz .


Bu komut için çağırabileceğim ayrı bir senaryo oluşturmak için bu gerçekten iyi bir fikir. -İ ve -I seçeneklerinin tam olarak ne yaptığını açıklayabilir misiniz? Teşekkürler!
Evster

-Bençeçmek istediğinizi onaylamak için "Enter" tuşuna bastıktan sonra size bir kez soracağım ("3" den fazla dosya / klasör olduğunda "); -i seçeneği, her dosya için "y" ve "Enter" düğmesine dokunarak onaylayabileceğiniz her bir bilgi istemi yayınlayacaktır; olumlu bir yanıt dışında herhangi bir şey, kaldırma işlemi sırasında bu özel dosyanın atlanmasına neden olacaktır.
ILMostro_7

1

Öncelikle dizinleri listelemeniz ve daha sonra bunları kaldırmanız gerekir, normal dosyaları engellemeden, ls -d * /, sadece alt dizinleri listeler ve rm ile boruları dizini ve içeriği kaldırır, gevşek dosyaları sağlam tutar.

Bu komut işi yapmalı

ls -d  */ | xargs rm -rf

1
Bunun faydası ne olurdu rm -rf -- */? argüman listesi etrafında çok büyük hatalar etrafında çalışmanıza printf '%s\0' */ | xargs -r0 rm -rf --yardımcı olur ( printfyerleşik olan ve olmayan kabuklarda ls) , ancak ek sorunlar dışında AFAICT hiçbir şey eklemiyor. ls -d */ | xargs rm -rf
Stéphane Chazelas 18:17

1
@AnthonyGeoghegan, örneğin " .."(boşluk ..) adlı bir dizin olsaydı evet , bazı lsuygulamalarla ana dizinin içeriğini kaldıracaktı . Ve sadece boşluklar değil, aynı zamanda diğer boş karakterler, yeni satırlar, tekli alıntılar, çift alıntılar, ters eğik çizgi ve dosya adları ile başlıyor -.
Stéphane Chazelas 18:17

2
@Ankit, mywiki.wooledge.org/ParsingLs ile başlayabilirsiniz
Stéphane Chazelas 18:17

1
@ StéphaneChazelas'ın printfher ismin boş karakterle sonlandırıldığı bir liste oluşturmak için kullanma önerisini tam olarak anladığınızda xargs, -0seçenekle işlenebilmesi için cevabını, değişkeni ile güncellemek için cevabınızı düzenlemenizi tavsiye ederim . Bunu anlarsanız ve potansiyel olarak varolan bazı dosya adlarının neden olduğu istenmeyen davranışlara karşı nasıl koruduğunu öğrendiyseniz, kod pasajını kullanmanızdan mutluluk duyacağından eminim.
Anthony G - Monica

1
Kullanmanın xargskabul edilen cevaba göre bir avantajı var (mevcut dizinde çok fazla sayıda dosya / dizin olduğunda işe yarar), bu yüzden bunu yararlı bir cevapta düzenleme alanı var. Şahsen, özellikle diğer kullanıcılardan yararlı geri bildirim aldığımda iyi bir öğrenme deneyimi olması için Stack Exchange sorularını yanıtlamayı buldum .
Anthony G - Monica

-1

rm -rf <directory name>. İşe yarıyor. Sadece yazmak rm <directory name>, alt dizinin her birinin manuel olarak kaldırılması gereken alt soru sayısına yol açar. Ancak, rm -rftüm dizini aynı anda alt dizinleriyle birlikte kaldırmaya yardımcı olur.


5
OP, mevcut dizinin içeriğini saklamak istedi.
Stephen Rauch
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.