特定の名前のフォルダを削除する方法


139

Linuxでは、フォルダー階層の深い階層にネストされている特定の名前のフォルダーを削除するにはどうすればよいですか?

次のパスはフォルダーの下にあり、という名前のすべてのフォルダーを削除したいと思いますa

1/2/3/a
1/2/3/b
10/20/30/a
10/20/30/b
100/200/300/a
100/200/300/b

親フォルダーからどのLinuxコマンドを使用する必要がありますか?


おそらく要点を逃しているかもしれませんが、それは誰かを助けるかもしれません:私はメインフォルダーに410のフォルダーを持っています-それぞれに2つのサブフォルダーがある410。最初のサブフォルダはすべて「最終版」という名前で、編集済みのPDFとWordコンテンツリストが含まれています。tif_pdf_various_namesという名前の2番目のすべてのサブフォルダーには、最初にスキャンされて保存されたtiffファイル(約200ページまで)、それらの未編集のPDF、およびドラフト.docxコンテンツリストが含まれているため、自宅の仕事のコレクションです。最終的に編集された素材のみを含む410個のフォルダーのコレクションを作成する必要がありました-ティフは4TB近くです。最も簡単な方法は、MICRの中で(使用することがわかった
Jurie

回答:


155

ターゲットディレクトリが空の場合は、検索を使用し、ディレクトリのみでフィルタリングし、名前でフィルタリングし、rmdirを実行します。

find . -type d -name a -exec rmdir {} \;

内容を再帰的に削除する場合は-exec rmdir {} \;-deleteまたはに置き換え-prune -exec rm -rf {} \;ます。他の回答には、これらのバージョンに関する詳細が含まれています。


9
何を説明できます{} \;か?
winklerrr

6
{}「一致するファイル/フォルダごと」として読み取ることができます。つまり、「見つかった」ファイル/フォルダごとに置き換えられます。句の\;ターミネータです-exec
wmorrison365

2
これにより、ディレクトリが空でない場合に「削除できません」というエラーが発生します
blindeyes

1
-prune@David Graysonの提案に従って、回答にフラグを追加することを検討してください。これfindがなくても、今はなくなったフォルダーにアクセスしようとし、最終的にエラーコードで終了します。これにより、Dockerビルドが失敗する可能性があります。
Czyzby

160

次のように、名前「a」にfindを使用し、rmを実行して、希望に応じて名前を付けたものを削除します。

find . -name a -exec rm -rf {} \;

最初にlsを使用してテストし、リストします。

find . -name a -exec ls {} \;

これにより、ディレクトリのみが削除され、プレーンファイルは削除されないようにするには、「-type d」引数を使用します(コメントで提案されています)。

find . -name a -type d -exec rm -rf {} \;

「{}」は、見つかった各ファイル「a」の置換です。execコマンドは、置換によってそれぞれに対して実行されます。


4
ファイルが同じ名前に一致する場合に備えて、そこに「-type d」を追加することをお勧めします。
Mark Loeser

3
また1/2/a/3/4、これは意図していない可能性のあるのようなものをキャッチすることにも注意してください。推奨を最初にテストするには+1してください
twalberg

9
echo {}代わりに最初にテストするためにrecols {}
Charney Kaye

2
ここに行くnode_modules/
saruftw

6
私が使用しfind . -name a -type d -exec rm -rf {} \;、それは機能しましたが、find: ‘./subdir/subdir/a’: No such file or directory削除されたディレクトリごとに出力されました。
pacoverflow

59

これも機能します-「a」と呼ばれるすべてのフォルダとその内容が削除されます。

rm -rf `find -type d -name a`

@バッファロー、どうして?このdefoは機能しますが、他の機能も機能します。これが機能するが、他の人がすべての答えを本質的に与えていない環境を見つけるとは驚きますfind/rm
wmorrison365 2016

4
@ wmorrison365 find . -name a -exec rm -rf {} \;を使用すると、ディレクトリに移動してさらにアイテムを検索しようとするとfindがクラッシュし、のようなエラーが発生しますfind: '1/2/3/a': No such file or directory
AlexGrönholm2017年

@AlexGrönholmもちろん、 'a'という名前のすべてのフォルダは削除されます。あなたが述べているように、findは削除された「a」フォルダー内を後で調べることはできませんが、それは問題ではありません。削除前に後続の処理のために「a」のコンテンツを保持することは、OPが要求したユースケースとは異なります。
wmorrison365 2017年

6
@ wmorrison365はい、ディレクトリは削除されますが、コマンドが失敗する(0以外の終了コードが返される)ソリューションを推奨するのは良いことではないと思います。
AlexGrönholm2017年

1
これは私にエラーを与えていましたillegal option --t。私はまた、(で検索するディレクトリをパスしなければならなかったstackoverflow.com/questions/25840713/...): rm -rf `find . -type d -name a`
スティーブハリソン

25

という名前のすべてのディレクトリを削除するには、次のコマンドをfoo実行します。

find -type d -name foo -a -prune -exec rm -rf {} \;

他の答えは重要なことを見逃している:-pruneオプション。なし-prune場合、GNU findは一致する名前のディレクトリを削除してから、そのディレクトリに再帰して、一致するディレクトリをさらに検索します。この-pruneオプションは、条件に一致したディレクトリに再帰しないように指示します。


21

私はここnode_modulesで、を使用して進行中の作業のバックアップを行う前に、自分のフォルダを削除しようとしていましたrsync。重要な要件は、node_modulesフォルダーをネストできることです-prune。そのため、オプションが必要です。

まず、これを実行して、削除するフォルダーを視覚的に確認しました。

find -type d -name node_modules -prune

次に、これを実行してそれらをすべて削除しました。

find -type d -name node_modules -prune -exec rm -rf {} \;

ピスタチェのおかげで


ああ、このあなたは少しシェルスクリプトとしてこれを保存することができ、簡単に使用することができます何か作るために、うまく働いている: sh #!/bin/bash echo "Found node_modules: "; find -type d -name node_modules -prune; read -r -p "Do you really want to delete all directories? [yes/no] " input; if [ ! $input != "yes" ]; then find -type d -name node_modules -prune -exec rm -rf {} \;; fi
Feirell

11
find ./ -name "FOLDERNAME" | xargs rm -Rf

トリックを行う必要があります。あなたが誤ってポンプ場合は警告、.または/xargs rm -Rfあなたの全体のコンピュータのOSの再インストールを必要とし、それを取り戻すためのオプションなしに削除されます。


2
ああ、まさにその小さなリスク。それだけですか?はは。警告をありがとう。私は間違いなくそのタイプミスをするでしょう。
TinkerTenorSoftwareGuy 2017年

9

のような100以上のファイルがありました

log-12
log-123
log-34
....

上記の答えは私にとってうまくいきませんでした

しかし、次のコマンドは私を助けました。

find . -name "log-*" -exec rm  -rf {} \;

私はそう与え-type.ので、それで始まるファイルとフォルダーの両方を削除しますlog-

そして rm -rfさえ、それはファイルを持って再帰的にフォルダが削除されます。

フォルダだけが必要な場合

find -type d -name "log-*" -exec rm  -rf {} \;

ファイルのみ

find -type f -name "log-*" -exec rm  -rf {} \;

8

複数の回答を組み合わせて、LinuxとMacOSの両方で機能するコマンドを次に示します

rm -rf $(find . -type d -name __pycache__)

エラーをスローし
なかった

7

別のもの:

"-exec rm -rf {} \;" can be replaced by "-delete"

find -type d -name __pycache__ -delete      # GNU find
find . -type d -name __pycache__ -delete    # POSIX find (e.g. Mac OS X)

3
この回答は空のフォルダに対してのみ機能します。-delete空でないフォルダは削除されません。
マニナックは

OSXバージョンを追加していただきありがとうございます
schu34

6

このコマンドは私にとってはうまくいきます。再帰的に機能します

find . -name "node_modules" -type d -prune -exec rm -rf '{}' +

。-現在のフォルダー

"node_modules"-フォルダー名


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