次のコマンド
mkdir -p /tmp/test/foo /tmp/test/bar && \
find /tmp/test/ -mindepth 1 -type d \
-exec echo Deleting "{}" \; \
-exec rm -rv "{}" \;
印刷したい
Deleting /tmp/test/foo
removed directory '/tmp/test/foo'
Deleting /tmp/test/bar
removed directory '/tmp/test/bar'
(最初の-exec
ステートメントに従って)対応するディレクトリを削除します(2番目のステートメント-exec
に従って)。まあ、技術的にこれはまさに起こっているもので、stdoutに印刷されます。しかし、stderrにはまだ2行があります。
Deleting /tmp/test/foo
removed directory '/tmp/test/foo'
find: ‘/tmp/test/foo’: No such file or directory
Deleting /tmp/test/bar
removed directory '/tmp/test/bar'
find: ‘/tmp/test/bar’: No such file or directory
-exec
したがって、2番目のステートメント呼び出しが2回実行されたようですrm -rv
。
- ここで正確に何が起こっていますか?
- 上記のコマンドで実際に期待する結果をどのように取得できますか?
ベストアンサー1
長い話を短く
find
あなたはエラーメッセージに似た警告メッセージに混乱し、rm
各ディレクトリでrmが複数回呼び出されていると思いますが、そうではありません。コマンド-depth
にaを追加すると、警告が停止し、find
予想される出力が表示されます。
説明する
ディレクトリ構造が少し複雑であれば、より明確になります。あなたは現在
$ tree /tmp/test
/tmp/test
├── bar
└── foo
しかし、あなたが言うなら
/tmp/test
├── bar
└── foo
└── wibble
└── hello.txt
したがって、 find コマンドの例ではあまり意味がないことがわかります。ディレクトリ内のファイルが見つかる順序は次のとおりです。限定されない、しかし、foo
最初に発見された後bar
。このコマンドは最初にfooサブツリーを削除するので、/tmp/test/foo/wibble/hello.txt、/tmp/test/foo/wibble、および/tmp/test/fooが削除されます。その後、foo
削除したディレクトリを処理しようとすると、警告メッセージを生成するように求められます。その後、/tmp/testの次の作業に進みますbar
。つまり、削除してからbar
削除したディレクトリに入ろうとし、警告メッセージを再印刷します。
find コマンドに a を追加すると、-depth
ディレクトリが処理されます。後ろにそれらのサブディレクトリ。したがって、順序は/tmp/test/foo/wibbleです(これにより、/tmp/test/foo/wibble/hello.txtと/tmp/test/foo/wibbleが削除されます)。その後、/tmp/test/foo(これを行うと削除されます)、空の/tmp/test/fooディレクトリを削除してから/tmp/test/barを削除します(これを行うと、/tmp/test/barディレクトリが削除されます) 。