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

418

Tüm dizini belirli bir uzantıyla (ör. .bak ) mevcut dizinden ve tüm alt klasörlerden tek bir komut satırı kullanarak nasıl güvenle silebilirim? Basitçe, bir kez yanlış kullandığım için rm kullanmaktan korkuyorum ve şimdi tavsiyeye ihtiyacım var.

    
sordu user216038 15.11.2013 14:03

6 cevap

657

Eğer korkuyorsanız, bu durumda rm kullanmanıza bile gerek yoktur. % Co_de% kullanın:

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

Fakat önlem olarak kullanın. Önce şunu çalıştır:

find . -name "*.bak" -type f
Hangi dosyaları kaldıracağınızı görmek için

.

Ayrıca, komutunuzun find 'sinin son argüman olduğundan emin olun . Bunu -delete 'den önce yaparsanız, her şeyi siler .

-name *.bak argument ve man find ve ayrıca SE ile ilgili şu soruya bakın:

verilen cevap Radu Rădeanu 15.11.2013 14:08
32
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
    
verilen cevap lokers 04.04.2014 21:10
28

İlk önce shopt -s globstar komutunu çalıştırın. Bunu komut satırında çalıştırabilirsiniz ve yalnızca bu kabuk penceresinde etkisi olacaktır. Bunu .bashrc 'inize koyabilirsiniz ve yeni başlatılan tüm kabuklar onu alır. Bu komutun etkisi, geçerli dizinde ve alt dizinlerinde **/ eşleşme dosyalarını yinelemeli olarak yapmaktır (varsayılan olarak, **/ , */ ile aynı anlama gelir: yalnızca hemen altdizinlerinde). Ardından:

rm **/*.bak

(veya gvfs-trash **/*.bak veya neye sahipseniz).

    
verilen cevap Gilles 15.11.2013 19:59
19

Dosyaları silmek benim için rm 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, yorumlarda belirtildiği gibi:

  

trash-cli paketi, gvfs'ye bağımlı olmadan gvfs-trash ile aynı şeyi yapıyor.

Yani:

sudo apt-get install trash-cli

Bunun için bir takma ad oluşturmanıza gerek yoktur, çünkü trash-cli paketi, istediğimiz şeyi yapan% co_de komutunu sağlar.

Eliah Kağan'ın kapsamlı yorumlarda belirttiği gibi, bu özyineyi trash kullanarak da yapabilirsiniz. Bu durumda, bir takma ad kullanamazsınız, bu nedenle aşağıdaki komutlar find yüklediğinizi varsayar. Eliah'ın yorumlarını özetliyorum:

Bu komut, tüm trash-cli dosyalarını bulur ve gösterir, mevcut dizinde veya alt dizinlerinde veya altında herhangi bir yerde bulunur.

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

Bunları silmek için .bak komutuyla -exec ekleyin:

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

trash , dosyaları değil, klasörleri seçer ve dosyaları seçer. .Bak klasörlerini de silmek için, bu bölümü kaldırın ve -xtype f dizinini -execdir dizininde cannot trash non-existent dizinleri .bak dizininden kaçınan .bak kullanın:

find . -name '*.bak' -execdir trash {} +
    
verilen cevap don.joey 15.11.2013 14:52
3

Belirli bir dosyadaki 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

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

    
verilen cevap Hypocritus 26.11.2017 18:21
0

Git repo içinde iseniz, şunları kullanabilirsiniz:

git clean -fdx

Bu, izlenmeyen dosyaları ve dosyaları .gitignore'da siler.

    
verilen cevap Vasantha Ganesh K 09.08.2018 09:38

Etiketlerdeki diğer soruları oku