"test"という名前のディレクトリがたくさんあり、それらを削除したいのですが。
私はそれらを見つけて印刷する方法を知っています:
find . -name test -print
それでは、ディレクトリを削除する方法を教えてください。
ディレクトリにもファイルがあるので、それらも削除する必要があります。
xargs
はすべての魔法を行います。
find . -name test -type d -print0|xargs -0 rm -r --
xargs
は、引数としてstdinに渡されたパラメータとして、渡されたコマンドを実行します。
これはディレクトリとそのすべての子を削除するために rm -r
を使っています。
--
は、-
で始まるパスが引数として扱われないようにするために、引数の終わりを示します。
-print0
は、改行の代わりに\0
文字を出力するようにfind
に指示します。そして-0
はxargs
に\0
のみを引数のセパレータとして扱うように伝えます。
これは一度に多くのディレクトリを持つrm
を呼び出すことで、ディレクトリごとに別々にrm
を呼び出すというオーバーヘッドを回避します。
代わりに、find
はselectedfileごとにコマンドを実行することもできます。
find . -name test -type d -exec rm -r {} \;
これは、複数のディレクトリを指定してrm
を一度に呼び出すので、パフォーマンスが向上します。
find . -name test -type d -exec rm -r {} +
(最後の+
に注意してください。これはxargs
ソリューションと同等です。)
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:
一度に複数のディレクトリを渡すには、+
の代わりに\;
を使用できます。
これを行うさらに別の方法は
find . -name test -exec rm -R "{}" \;
見つける上で役に立つリンク: http://www.softpanorama.info/Tools/Find/using_exec_option_and_xargs_in_find.shtml
-execオプションも使用できます
find . -name test -exec rm {} \;
別の答えが指摘するように、test
という名前のすべてのディレクトリを見つけて削除することを試みることができます。
find -name "test" -type d -delete
私はMac上の相互互換性に関していくつかの問題に遭遇したので、私はこの同等のコマンドを使いました:
find -path "*/test" -type d -delete
しかし、どちらの場合でも、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
Bash 4+を仮定
shopt -s globstar
rm -r ./**/test/
末尾のスラッシュは、それがディレクトリーにのみ一致することを意味します。テストは事前にあります:
printf '%s\n' ./**/test/