mv:AとBは同じファイルです。

mv:AとBは同じファイルです。

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)以前と同じテストと操作を実行します。


mvGNUツールを使用している場合は、できるだけ少ない呼び出しを実行して作業を高速化できます。

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つしかない場合、これらの最適化は大きな影響を与えませんが、数千のファイルがあると速度が大幅に向上する可能性があります。

関連情報