web-dev-qa-db-ja.com

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

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

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

find . -name test -print

それでは、ディレクトリを削除する方法を教えてください。


ディレクトリにもファイルがあるので、それらも削除する必要があります。

33

xargs はすべての魔法を行います。

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

xargsは、引数としてstdinに渡されたパラメータとして、渡されたコマンドを実行します。

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

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

-print0は、改行の代わりに\0文字を出力するようにfindに指示します。そして-0xargs\0のみを引数のセパレータとして扱うように伝えます。

これは一度に多くのディレクトリを持つrmを呼び出すことで、ディレクトリごとに別々にrmを呼び出すというオーバーヘッドを回避します。


代わりに、findselectedfileごとにコマンドを実行することもできます。

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

これは、複数のディレクトリを指定してrmを一度に呼び出すので、パフォーマンスが向上します。

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

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

68
Arnaud Le Blanc
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 {} \;

AsJ.F。コメントに述べられているSebastian

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

23
jaypal singh

これを行うさらに別の方法は

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

見つける上で役に立つリンク: http://www.softpanorama.info/Tools/Find/using_exec_option_and_xargs_in_find.shtml

7
maazza

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

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

gnu find を使用していると仮定すると、-deleteオプションを使用できます。

find . -name test -delete

これは覚えやすいです。

2
Chun Yang

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

find -name "test" -type d -delete

私はMac上の相互互換性に関していくつかの問題に遭遇したので、私はこの同等のコマンドを使いました:

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

しかし、どちらの場合でも、testという名前のディレクトリにファイルがあると、findDirectory 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
2
Karl

Bash 4+を仮定

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

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

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