Linuxで「test」という名前のすべてのディレクトリを見つけて削除します


35

「test」という名前のディレクトリがたくさんあり、それらを削除したいと思います。

私はそれらを見つけて印刷する方法を知っています:

find . -name test -print

今、ディレクトリを削除する方法は?


ディレクトリにもファイルがあり、それらも同様に削除する必要があることに注意してください。

回答:


70

xargs すべての魔法をします:

find . -name test -type d -print0|xargs -0 rm -r --

xargs 引数として渡されたコマンドを、stdinに渡された引数とともに実行します。

これはrm -r、ディレクトリとそのすべての子を削除するために使用しています。

--は、引数の終わりを示します。これは、で始まるパスが-引数として扱われないようにするためです。

-print0改行の代わりに文字findを印刷するように指示します\0。そして、-0告げるxargsだけで治療するための\0引数の区切りとして。

これはrm、多くのディレクトリを一度に呼び出してrmいるため、ディレクトリごとに個別に呼び出すオーバーヘッドが回避されます。


別の方法として、選択findした各ファイルに対してコマンドを実行することもできます。

find . -name test -type d -exec rm -r {} \;

そして、これrm複数のディレクトリを一度に呼び出すため、パフォーマンスが向上します:

find . -name test -type d -exec rm -r {} +

+最後に注意してください。これはxargsソリューションと同等です。)


1
特に優れた答え+です。ずっと前に知っていたらよかったのにと思いました。
スコット

最後のコマンドに気をつけてください、どういうわけかいくつかのファイルを削除しました。xargsコマンドがうまく働きました。
エンリケデスーサ

23
find /path/to/dir -name "test" -type d -delete
  • -name:渡された名前を探します。-regex正規表現に基づいて名前を提供するために使用できます

  • -type:ファイルタイプを探します。dディレクトリのみを探す

  • -delete:見つかったリストを削除するアクション。

代わりに:

find /path/to/dir -name "test" -type d -exec rm -rf {} \;

以下のようJFセバスチャンはコメントで次のように述べました。

+代わりに\;を使用して、一度に複数のディレクトリを渡すことができます。


1
申し訳ありませんが、これらのディレクトリにファイルがある可能性があることを忘れていました。「検索: `./start 'を削除できません:ディレクトリが空ではありません」というエラーのため、それらの一部を削除できませんでした
ガベージコレクション

@garbagecollectionアップデートを追加しました。
ジェイパルシン

3
+代わりに使用\;して、一度に複数のディレクトリを渡すことができます。
jfs

ありがとう@JFSebastian良い点。答えに追加します。
ジェイパルシン


5

-execオプションも使用できます

find . -name test -exec rm {} \;

3

bash 4+を想定

shopt -s globstar
rm -r ./**/test/

末尾のスラッシュは、ディレクトリのみに一致することを意味します。テストは事前に:

printf '%s\n' ./**/test/


2

別の答えが指摘するように、名前を持つすべてのディレクトリを見つけてtest削除することができます

find -name "test" -type d -delete

Macでの相互互換性に関するいくつかの問題に遭遇したため、この同等のコマンドを使用しました。

find -path "*/test" -type d -delete
  • -path:完全修飾ファイル名でパターンを探します。

ただし、いずれの場合でも、指定されたディレクトリのいずれかにtestファイルが含まれている場合、、およびディレクトリの削除に失敗するfindことを訴えDirectory is not emptyます。

ディレクトリを含むすべてのファイル削除する場合testは、同じトリックを使用して、test最初に指定されたディレクトリ内のすべてのファイルを削除できます。

find -path "*/test/*" -delete

パターン:は"*/test/*"、という名前のディレクトリ内のファイルのみを削除することを保証します/test/。ディレクトリが空になったら、最初のコマンドを使用してディレクトリを削除できます。

find -path "*/test" -type d -delete

例:

$ tree
.
├── mytest
│   └── test
│       └── blah.txt
├── test
│   ├── bar.jpg
│   └── dir
│       └── bar.bak
└── testdir
    └── baz.c

5 directories, 4 files

$ find -path "*/test" -type d -delete
$ tree
.
├── mytest
│   └── test
├── test
└── testdir
    └── baz.c

4 directories, 1 file

$ find -name "test" -type d -delete
$ tree
.
├── mytest
└── testdir
    └── baz.c

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