私は間違いなく何かが間違っていますが、それを理解することはできません。rm -rf
ディレクトリで実行するとfind
エラーが発生しますNo such file or directory
が、手動で実行するとそのようなことは発生しません。次のディレクトリツリーを想定します。
[~]$ mkdir -p blueprints/blog
[~]$ find
.
./blueprints
./blueprints/blog
ディレクトリを作成し、ここにファイルを追加します。
[~]$ mkdir ./blueprints/blog/__pycache__ ./blueprints/__pycache__ ./__pycache__
[~]$ touch ./blueprints/blog/__pycache__/dummy.pyc ./__pycache__/dummy.pyc
私はそれらを持っていると確信しています:
[~]$ find . -type d -name '__pycache__'
./blueprints/blog/__pycache__
./blueprints/__pycache__
./__pycache__
ただし、これを削除すると、findからエラーが印刷されます。
[~]$ find . -type d -name '__pycache__' -exec rm -rf {} \;
find: ‘./blueprints/blog/__pycache__’: No such file or directory
find: ‘./blueprints/__pycache__’: No such file or directory
find: ‘./__pycache__’: No such file or directory
削除されましたが、そこで何が起こりましたか?
別の方法で実行してもエラーは発生しません。
[~]$ mkdir ./blueprints/blog/__pycache__ ./blueprints/__pycache__ ./__pycache__
[~]$ touch ./blueprints/blog/__pycache__/dummy.pyc ./__pycache__/dummy.pyc
[~]$ find . -type d -name '__pycache__' -exec echo rm -rf {} \; | sh
findがこのエラーを報告するのはなぜですか? 私が知っている限り、そのタスクが-exec
存在する場合、そのタスクは呼び出されません-print
(これは私が元々疑っていたものです)。
find 4.6.0とfind 4.5.11を使用して上記の内容を複製しました。
答え1
ディレクトリの削除を使用すると、ディレクトリをrm -rf
削除した後もディレクトリに入ろうとします(何をしているのかfind
わからない)。rm
ここでエラーが発生します。
このフラグを追加する必要があります-depth
。
~からPOSIXfind
マニュアル:
-depth
デフォルトは常にtrueと評価する必要があり、ディレクトリ階層を降順に実行して、ディレクトリ内のすべてのエントリがディレクトリ自体の前に実行されるようにします。ホームディレクトリが指定されていない場合、
-depth
ディレクトリ内のすべてのエントリはディレクトリ自体の後に機能する必要があります。キー値が指定されている場合、-depth
そのキー値は通常評価されない場合でも、式全体に適用されます。-depth