長い話を短く

長い話を短く

次のコマンド

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ディレクトリが削除されます) 。

おすすめ記事