find -exec mvが最初の実行後に停止しました

find -exec mvが最初の実行後に停止しました

この問題を調査している間:ファイルの種類と日付に基づいてディレクトリを検索して移動する、私は自分の問題を偶然発見しました。

まず、ファイルを含む複数のディレクトリを作成しました。

seq 10 | while read dir; do
  mkdir dir$dir
  touch dir$dir/file.txt
  seq 5 | while read file; do
    touch dir$dir/file${dir}_$file
  done
done

その後、次のfindコマンドを試しました。

$ find -type f -name "*.txt"
./dir6/file.txt
./dir8/file.txt
./dir10/file.txt
...

期待どおりに動作します。

以下があります-exec

$ find -type f -name "*.txt" -exec sh -c 'echo mv -v "${0%/*}" ../bar' {} \;
mv -v ./dir6 ../bar
mv -v ./dir8 ../bar
mv -v ./dir10 ../bar
...

期待どおりに動作します。

これで実際のコマンドは次のようになります。

$ find -type f -name "*.txt" -exec sh -c 'mv -v "${0%/*}" ../bar' {} \;
`./dir6' -> `../bar/dir6'

最初の後に停止しますmv。エラーメッセージはありません。終了状態は 0 です。ディレクトリがbar存在し、dir6正しく移動されました。

再実行すると、これが起こります。

$ find -type f -name "*.txt" -exec sh -c 'mv -v "${0%/*}" ../bar' {} \;
`./dir8' -> `../bar/dir8'

最初の後に再び停止してくださいmv。終了状態は 0 です。dir8正しく移動されました。

find最初の後になぜ停止したのですかmv?ディレクトリが移動されたのでfind混乱していますか?なぜエラーを印刷しないか、エラー終了ステータスを返さないのですか?

より多くのディレクトリとより多くのファイルを作成すると、同じ動作が発生します。

上記の質問では、問題はfind問題なく一度実行されますが、それ以降のすべての一致はエラーを印刷することです。それはそんなに重要なのか?

使用find (GNU findutils) 4.4.2

答え1

存在する:

find -type f -name "*.txt" -exec sh -c 'mv -v "${0%/*}" ../bar' {} \;

find現在のディレクトリ(.)を開き、内容(list1)を取得します。その後、リスト操作を続行します。ファイルがdir6ディレクトリなので;ディレクトリに移動してファイルを開き、2番目のファイルリスト(list2)を取得して処理file.txtし、次の手順を実行します。

mv -v ./dir6 ../bar

現在findのディレクトリは変更されていませんが、パスは次のようになります。今です../bar/dir6。内容を巡回した後dir6()に戻り、chdir("..")現在にあります../barfind検出されたディレクトリは以前とは異なり、終了しました。

関連情報