Geçerli dizindeki belirli bir uzantıdaki tüm dosyaları tekrar tekrar nasıl silebilirim?


531

.bakTek bir komut satırı kullanarak belirli bir uzantıya sahip tüm dosyaları (örn. ) Geçerli dizinden ve tüm alt klasörlerden nasıl silerim ? Basitçe, bir rmkere yanlış kullandığım için kullanmaktan korkuyorum ve şimdi tavsiyeye ihtiyacım var.

Yanıtlar:


839

Eğer rmkorkuyorsan bu durumda kullanmana bile gerek yok . Kullanım find:

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

Ancak önlemle kullanın. İlk önce koş:

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

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

Ayrıca, komutunuzdaki son argüman olduğundan emin olun-delete . Daha önce koyarsanız -name *.bak argument, her şeyi silecektir .

Daha fazla bilgi için bakınız man findve man rmSE ile ilgili şu soruya bakınız:


Bunun farkı ne rm *.bak?
sayantankhan

10
@ Bolt64 Sizin rm *.bakalt dizinlerde çalışmayacak.
Radu Rădeanu

Varsayılan ayarlarla rm *.baksadece geçerli dizinde .bak ile biten tüm dosyalar silinir. Ayrıca, alt dizinlerde, globs'la dolaşmanız için gerekenleri yapmak, -r seçeneğini kullanın veya find örneğini kullanın.
Hennes

9
@Hennes Dikkatli olun rm -r *.bak! Ayrıca .baktüm içeriği ile biten dizinleri de kaldırır .
Radu Rădeanu

37
Emin olun o -deletesenin komuta son argümandır. Argümandan önce koyarsanız -name *.bak, her şeyi silecektir.
Michael,

40
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f

1
Askubuntu'ya hoş geldiniz! Bu mükemmel geçerli bir cevap olsa da, bunun yerine -deletebayrak kullanmanın bir avantajı olduğunu sanmıyorum find. GNU kılavuzları girişinde bulunan dosyaları silmek için daha fazla bilgiyi bulabilirsiniz .
Glutanimate,

2
Muhtemelen haklısın, sadece alternatif bir çözüm, belki de daha ham;)
Lokers

11
Bu sadece bir alternatif değil, diğer komutların '|' borusu ile nasıl birleştirilebileceğinin bir örneğidir. +1
Boris Pavlović

13
Bu alternatif çözümler -delete (cygwin gibi) olmayan diğer ortamlarda çalışır
ciriarte

2
Bence buradaki en iyi cevap bu.
Léo Léopold Hertz 준영

33

İlk önce komutu çalıştırın shopt -s globstar. Bunu komut satırından çalıştırabilirsiniz ve yalnızca bu kabuk penceresinde etkili olur. Onu içine koyabilirsin .bashrc, ve sonra yeni başlatılan tüm mermiler alacak. Bu komutun etkisi **/, geçerli dizindeki ve alt dizinlerindeki eşleşen dosyaları yinelemeli olarak eşleştirmektir (varsayılan olarak, şu **/anlama gelir */: yalnızca yalnızca alt dizinlerde). Sonra:

rm **/*.bak

(veya gvfs-trash **/*.baksizde ne var).


21

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

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

Flimm'in dediği gibi yorumlar:

Paket trash-cliaynı şeyi gvfs-trashgvfs bağımlılığı olmadan yapar.

Yani:

sudo apt-get install trash-cli

Bunun için bir takma ad kullanmanıza gerek yok, çünkü trash-clipaket trashistediğimizi yapan bir komut veriyor .

Eliah Kagan, geniş yorumlarda açıkça ifade ettiği gibi, bu özyinelemeli kullanımı da yapabilirsiniz find. Bu durumda bir takma ad kullanamazsınız, bu nedenle aşağıdaki komutlar yüklediğinizi varsayar trash-cli. Eliah'ın yorumlarını şöyle özetliyorum:

Bu komut .bak, geçerli dizinde veya alt dizinlerinde veya altında bulunan tüm dosyaları ve sembolik bağları bulur ve görüntüler .

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

Onları silmek için, bir komut -execile bir ekleyin trash:

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

-xtype fdosyaları ve sembolik dosyaları dosyalara seçer, ancak klasörleri seçmez. .Bak klasörlerini de silmek için, o bölümü kaldırın ve dizinlerdeki dosyalar için hataları -execdirönleyen kullanın :cannot trash non-existent.bak.bak

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

4
" rmBir şeyi silmek için kullanmayın " tartışmalı bir ifadedir, ancak bazı şeyleri geri almanıza izin verecek bir şey kullanmanın daha akıllıca olduğunu kabul etmek zorundayım.
Oli

2
Paket bağımlılık yapmadan trash-cliaynı şeyi yapar . gvfs-trashgvfs
Flimm

Ben cevap yazdım, bir dahaki sefere düzenlemeyi kendiniz yapmaktan çekinmeyin.
Don.joey

@ don.joey Bu cevap find . -name "*.bak" -type fneyin trash *.baksilindiğini gösterir gibi görünüyor . Gerçekten demek istediğin bu mu? Dizinleri çöp kutusuyla trashveya ile birlikte taşıyabilirsiniz gvfs-trash, ancak trash *.bakyalnızca .bakgeçerli dizinde bulunan ve adları biten ve sonundaki dosya ve dizinleri taşır . Kabuk genişler *.bak, bu nedenle kendileri adlandırılmayan alt dizinlerdeki dosyaları trash *.baketkilemez . .bak.bak
Eliah Kagan

1
@ don.joey Evet ls *.bak(sanırım demek istediğin) çöpleri listeler trash *.bak. altındaki find . -name '*.bak' -xtype f -exec trash {} +tüm .bakdosyaları çöker .. Bir takma ad kullanamaz, bu nedenle yükleyin trash-cliveya yazın gvfs-trash. İşte bir örnek. -xtype fdosyaları ve sembolik dosyaları dosyalara seçer, ancak klasörleri seçmez. .bak Klasörleri de silmek için find . -name '*.bak' -execdir trash {} +, dizin içindeki dosyalar cannot trash non existentiçin hataları önleyen kullanın . Lütfen cevaplarınızda bunlardan herhangi birini kullanmaktan çekinmeyin. .bak.bak
Eliah Kagan

5

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

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

- maxdepth 2, çünkü geçerli dizin " . " ilk klasör sayılır.


1

Hızlı cevap:

  • Kabul edilen ad veya posta eki olan tüm dosyaları tekrar tekrar silin:

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

  • Kabul edilen isimdeki tüm dizinleri tekrar tekrar silin:

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

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

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

[ NOT ]:

ddizin seçeneği ve fdosya seçeneği.


0

Git deposundaysanız, şunları kullanabilirsiniz:

git clean -fdx

Bu, izlenmeyen dosyaları ve .gitignore içindeki dosyaları siler.

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.