我正在尝试将 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
将仅使用批量路径名调用几次,而不是每次使用单个路径名多次调用。
如果您只有五个文件,这些优化不会产生太大影响,但如果您有数千个文件,则可能会显着加快速度。