web-dev-qa-db-ja.com

現在のディレクトリにある特定の拡張子のすべてのファイルを再帰的に削除するにはどうすればよいですか?

1つのコマンドラインを使用して、特定の拡張子(たとえば、.bak)を持つすべてのファイルを現在のディレクトリとすべてのサブフォルダーから安全に削除するにはどうすればよいですか?単純に、rmを使用するのが怖いのは、一度間違って使用したので、今はアドバイスが必要だからです。

520
user216038

この場合、恐れている場合はrmを使用する必要さえありません。 findを使用します。

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

ただし、注意して使用してください。最初に実行:

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

削除するファイルを正確に確認します。

また、-deleteがコマンドの最後の引数であることを確認してください。 -name *.bak argumentの前に置くと、すべて削除されます

詳細については man find および man rm を参照してください。SEに関するこの関連する質問も参照してください。

825
Radu Rădeanu
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
39
lokers

最初にコマンドshopt -s globstarを実行します。これはコマンドラインで実行でき、そのシェルウィンドウでのみ有効になります。 .bashrcに入れると、新しく起動されたすべてのシェルがそれを取得します。このコマンドの効果は、**/を現在のディレクトリとそのサブディレクトリ内のファイルに再帰的に一致させることです(デフォルトでは、**/*/:と同じことを意味します)。次に:

rm **/*.bak

(またはgvfs-trash **/*.bakまたはあなたが持っているもの)。

33
Gilles

ファイルを削除することは、私にとってrmを使用すべきではありません。以下が代替案です。

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がコメントで述べているように:

パッケージtrash-cliは、gvfsに依存せずにgvfs-trashと同じことを行います。

そう:

Sudo apt-get install trash-cli

trash-cliパッケージはtrashコマンドを提供するため、これにエイリアスを作成する必要はありません。

Eliah Kaganが広範なコメントで明らかにしているように、findを使用してこの再帰を行うこともできます。その場合、エイリアスを使用できないため、以下のコマンドはtrash-cliがインストールされていることを前提としています。エリアのコメントを要約します。

このコマンドは、現在のディレクトリまたはそのサブディレクトリ以下にあるすべての.bakファイルとシンボリックリンクを検索して表示します。

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

それらを削除するには、trashコマンドで-execを追加します。

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

-xtype fは、ファイルとファイルへのシンボリックリンクを選択しますが、フォルダーは選択しません。 .bakフォルダも削除するには、その部分を削除し、-execdirディレクトリ内のcannot trash non-existentファイルの.bakエラーを回避する.bakを使用します。

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

特定のタイプのすべてのファイルを削除したいが、現在のフォルダーから「深い」フォルダーが1つだけの場合:

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

-maxdepth 2現在のディレクトリ ""は最初のフォルダーとしてカウントされるため。

4
Hypocritus

素早い回答:

  • 考慮された名前または接尾辞を持つすべてのファイルを再帰的に削除します。

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

  • 考慮された名前を持つすべてのディレクトリを再帰的に削除します。

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

    少し厳密に制御されますが、1行で:

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

[NOTE]:

dはディレクトリオプションで、fはファイルオプションです。

1
Benyamin Jafari

Gitリポジトリ内にいる場合は、次を使用できます。

git clean -fdx

これにより、追跡されていないファイルと.gitignore内のファイルが削除されます。

0