Geçerli dizindeki belirli bir uzantının tüm dosyalarını yinelemeli olarak nasıl silebilirim?

Belirli bir uzantıya sahip tüm dosyaları güvenli bir şekilde nasıl silebilirim (örn. .bak) geçerli dizinden ve tüm alt klasörlerden tek bir komut satırı kullanarak mı? Basitçe, kullanmaktan korkuyorum rm bir keresinde yanlış kullandığımdan beri şimdi tavsiyeye ihtiyacım var.

Kullanmana bile gerek yok. rm bu durumda korkuyorsanız. Kullanmak find:

find . -name "*.bak" -type f -delete

Ama tedbirli kullan. Önce koş:

find . -name "*.bak" -type f

tam olarak hangi dosyaları kaldıracağınızı görmek için.

Ayrıca, emin olun -delete bu son argüman mı emrinizdeyim. Eğer daha önce koyarsanız -name *.bak argument, her şeyi silecek.

Görmek man find ve man rm daha fazla bilgi için ve ayrıca SE ile ilgili bu soruya bakın:

bulun. -ad "*.bak" -f -print0 | xargs -0 /bın/rm -f yazın

Önce komutu çalıştırın shopt -s globstar. Bunu komut satırında çalıştırabilirsiniz ve yalnızca o kabuk penceresinde etkili olur. İçine koyabilirsin. .bashrc ve sonra yeni başlatılan tüm mermiler onu alacak. Bu komutun etkisi **/ geçerli dizindeki ve alt dizinlerindeki dosyaları yinelemeli olarak eşleştirin (varsayılan olarak, **/ aynı anlama geliyor */: yalnızca anlık alt dizinlerde). Sonra:

rm **/*.bak

(veya gvfs-trash **/*.bak ya da ne var).

Dosyaları silmek benim için kullanmanız gereken bir şey değil rm için. İşte bir alternatif:

sudo apt-get install gvfs     # install a tool that allows you to put stuff in the trashalias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without aliastrash *.bak                   # trash the files (thus moving them to the trash bin)

Flimm'in yorumlarda belirttiği gibi:

Paket trash-cli aynı şeyi yapar gvfs-trash gvfs'ye bağımlılık olmadan.

Böyle:

sudo apt-get install trash-cli

Bunun için bir takma ad yapmanıza gerek yok, çünkü trash-cli paket bir komut sağlar trash bu da bizim istediğimizi yapar.

Eliah Kagan'ın kapsamlı yorumlarda açıkça belirttiği gibi, bunu özyinelemeli olarak da yapabilirsiniz find. Bu durumda takma ad kullanamazsınız, bu nedenle aşağıdaki komutlar yüklediğinizi varsayar trash-cli. Eliah'ın yorumlarını özetliyorum.:

Bu komut tümünü bulur ve görüntüler .bak dosyalar ve sembolik bağlar geçerli dizinin veya alt dizinlerinin herhangi bir yerinde veya altında.

find . -name '*.bak' -xtype f

Bunları silmek için bir -exec ile... trash komut:

find . -name '*.bak' -xtype f -exec trash {} +

-xtype f dosyaları seçer ve dosyalara sembolik bağlar, ancak klasörleri seçmez. Silmek .bak klasörleri de, bu bölümü kaldırın ve kullanın -execdir. hangi önler cannot trash non-existent hatalar için .bak içindeki dosyalar .bak dizinler:

find . -name '*.bak' -execdir trash {} +

Belirli bir türdeki tüm dosyaları silmek istiyorsanız, ancak geçerli klasörden yalnızca 1 klasör "derin":

find . -maxdepth 2 -name "*.log" -type f -delete

-maksimum derinlik 2 çünkü geçerli dizin "." ilk klasör olarak sayılır.

Hızlı Cevap:

  • Söz konusu ada veya postfix'e sahip tüm dosyaları yinelemeli olarak silme:

    find . -name '*.pyc' -type f -delete

  • Söz konusu ada sahip tüm dizinleri yinelemeli olarak silme:

    find ~ -path '*/__pycache__/*' -delete‍‍‍find ~ -type d -name '__pycache__' -empty -delete‍‍‍

    Biraz daha az sıkı bir şekilde kontrol edilir, ancak tek bir satırda:

    find ~ -path '*/__pycache__*' -delete

[not]:

d dizin seçeneği ve f dosya seçeneğidir.

Kullanmadan önce önce bu uzantıya sahip tüm dosyaları listeleyebilirsiniz rmÖrneğin,

ls *.bak

Yalnızca silmek istediğiniz dosyaları alırsanız, aşağıdakileri kullanabilirsiniz: rm

rm *.bak

Dosyaları silmeden önce listeyi kontrol etmek isterseniz, listeyi tekrarlayabilirsiniz.

find . -name "*.bak" -type f | xargs echo rm -rf

Bu, xargs aracılığıyla rm komutuna yönlendirilen arama sonuçlarını listeler.Listeden emin olduktan sonra echo'yu yukarıdaki komutta bırakabilirsiniz.

find . -name "*.bak" -type f | xargs rm -rf

Related post - Dizinleri joker karakterle yinelemeli olarak nasıl silebilirim?