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-雖然-他們-是-c但答案似乎並沒有解釋這個問題,回答者說他們後來也偶然發現了這個問題。
您的
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
將只使用批量路徑名呼叫幾次,而不是每次使用單個路徑名多次呼叫。如果您只有五個文件,這些優化不會有太大區別,但如果您有數千個文件,它可能會顯著加快速度。