この問題を調査している間:ファイルの種類と日付に基づいてディレクトリを検索して移動する、私は自分の問題を偶然発見しました。
まず、ファイルを含む複数のディレクトリを作成しました。
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("..")
現在にあります../bar
。find
検出されたディレクトリは以前とは異なり、終了しました。。