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


531

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

回答:


839

あなたrmが恐れている場合、この場合に使用する必要さえありません。使用find

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

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

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

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

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

を参照man findman rmて詳細を確認し、SEに関連するこの質問も参照してください。


これはどう違いrm *.bakますか?
-sayantankhan

10
@ Bolt64 rm *.bakサブディレクトリでは機能しません。
ラドゥラデアヌ

デフォルト設定でrm *.bakは、現在のディレクトリにある.bakで終わるすべてのファイルのみが削除されます。また、グロブをいじるのに必要なサブディレクトリで処理を行うには、-rオプションを使用するか、検索例を使用します。
ヘネス

9
@Hennesに注意してくださいrm -r *.bak!また.bak、すべてのコンテンツで終わるディレクトリも削除します。
ラドゥラデアヌ

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

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

1
askubuntuへようこそ!これは完全に有効な答えですが、の-deleteフラグの代わりにこれを使用することに利点はないと思いますfind。詳細については、findを使用してファイルを削除するためGNUマニュアルエントリを参照してください
グルタニメート14

2
あなたはおそらく正しい、それは単なる代替ソリューション、おそらくより生の;)
ローカー14

11
これは単なる代替ではなく、他のコマンドをパイプ「|」と組み合わせる方法の例です。+1
ボリスパブロヴィッチ14年

13
この代替ソリューションは、-delete(cygwinなど)のない他の環境で動作します
ciriarte 14

2
ここが最良の答えだと思います。
レオレオポルトヘルツ준영

33

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

rm **/*.bak

(またはgvfs-trash **/*.bak、何を持っていますか)。


21

ファイルの削除は、私にとってはあなたが使うべきものではありません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-trashgvfsに依存しない場合と同じことを行います。

そう:

sudo apt-get install trash-cli

trash-cliパッケージには、必要な処理を行うコマンドが用意されているため、このエイリアスを作成する必要trashはありません。

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

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

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

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

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

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

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

4
rm物事を削除するために使用しない」は物議を醸す声明ですが、物事を元に戻すことができるものを使用する方が賢明であることが多いことに同意する必要があります。
オリ

2
パッケージtrash-cliはにgvfs-trash依存しない場合と同じことを行いgvfsます。
フリム

回答で編集しました。次回は自分で編集してください。
don.joey

@ don.joeyこの回答は、削除find . -name "*.bak" -type fされたものを表示すると言うようtrash *.bakです。それは本当にあなたの言うことですか?あなたがゴミ箱にディレクトリを移動することができtrashたりgvfs-trash、しかしtrash *.bak唯一の名前で終わるファイルやディレクトリに移動します.bakと、現在のディレクトリにすぐに常駐します。シェルが展開される*.bakため、サブディレクトリ内のファイル自体にtrash *.bakは影響しません。.bak.bak
エリアケイガン

1
@ don.joeyはいls *.bak(これはあなたの言うことだと思います)はどのようなtrash *.bakゴミをリストします。find . -name '*.bak' -xtype f -exec trash {} +は、の下にあるすべての.bakファイルを破棄します.。エイリアスを使用できないため、代わりにインストールtrash-cliまたは書き込みgvfs-trashを行ってください。以下に例を示します。 -xtype fファイルとファイルへのシンボリックリンクを選択しますが、フォルダーは選択しません。.bak フォルダーも削除するにはfind . -name '*.bak' -execdir trash {} +、を使用して、ディレクトリ内のファイルのcannot trash non existentエラーを回避し.bakます.bak。回答の中でこれを自由に使用してください。
エリアケイガン

5

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

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

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


1

素早い回答:

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

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

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

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

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

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

[ ]:

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


0

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

git clean -fdx

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.