5つの.MOVファイルをMOVというフォルダに移動しようとしています。find
ファイルをリストし、ファイルを移動するために使用するものmv
:
$ mkdir MOV ; find . -type f -iname '*.MOV' -exec mv "{}" "MOV" \;
mv: './MOV/IMG_2391.MOV' and 'MOV/IMG_2391.MOV' are the same file
mv: './MOV/IMG_2395.MOV' and 'MOV/IMG_2395.MOV' are the same file
mv: './MOV/IMG_2401.MOV' and 'MOV/IMG_2401.MOV' are the same file
これが私に警告する理由を理解していなかったので、ファイルを元の場所に戻し、今回はファイルがecho
何をしているのかを確認したかったのです。
$ mkdir MOV ; find . -type f -iname '*.MOV' -exec echo mv "{}" "MOV" \;
mv ./IMG_2391.MOV MOV
mv ./IMG_2394.MOV MOV
mv ./IMG_2395.MOV MOV
mv ./IMG_2400.MOV MOV
mv ./IMG_2401.MOV MOV
重複がなくていいですね。
ターゲットフォルダの名前をMOV以外の名前で指定すると、警告は表示されなくなります。また、使用すると-maxdepth 1
警告find
はありません。または単にmv *.MOV MOV
。
ここで同様の質問を見つけました。https://askubuntu.com/questions/1143012/why-do-i-get-x-and-y-are-the-same-file-when-using-mv-even-though-they-are-cしかし、その答えは問題を説明できないようで、回答者は後で偶然その問題を発見したと言いました。
答え1
コマンドは、ファイルをfind
現在のディレクトリから呼び出されたディレクトリに移動します。MOV
コマンドの作成方法によっては、ディレクトリ内のファイルも検索し、一致するファイルが見つかった場合MOV
(ディレクトリが最初のディレクトリでない場合、またはコマンドをMOV
複数回実行した場合に発生する可能性があります)、既に存在するディレクトリに移動してみてください。これにより、表示される診断メッセージが生成されます。
この問題を解決するには、ディレクトリの内部を表示しないようにfind
指示できます。MOV
find . -path ./MOV -prune -o -type f -iname '*.MOV' -exec mv {} MOV \;
これは-path ./MOV -prune
現在のパス名があるかどうかをテストし./MOV
、その場合は検索パスからそれを削除し、次のディレクトリエントリを探し続けます。それ以外の場合(-o
)以前と同じテストと操作を実行します。
mv
GNUツールを使用している場合は、できるだけ少ない呼び出しを実行して作業を高速化できます。
find . -path ./MOV -prune -o -type f -iname '*.MOV' -exec mv -t MOV {} +
GNU ツールがない場合は、インラインスクリプトを使用して同じタイプの最適化を実行します。
find . -path ./MOV -prune -o -type f -iname '*.MOV' -exec sh -c 'mv "$@" MOV' sh {} +
元のコマンドの両方のバリエーションでは、mv
毎回単一パス名で複数回呼び出されるのではなく、バッチパス名で数回呼び出されます。
ファイルが5つしかない場合、これらの最適化は大きな影響を与えませんが、数千のファイルがあると速度が大幅に向上する可能性があります。