Bash find -exec cp 命令未复制所有文件

3
我正在编写一个bash脚本来查找图像文件并将它们复制到一个目录中。我的问题是,当我使用"find"命令时,它会找到所有的文件,但是当我添加...(未完待续)
-exec cp -n {} $2 \;

我知道我已经设置了“不覆盖”,但我的测试用例已经考虑到了这一点,我还在脚本后面放置了一个经过验证的重命名机制。

当我在终端中输入时,我遇到了相同的问题。

find Desktop -iname '*.JPG' -o -iname '*.jpeg' -o -iname '*.jf[il1]f' -o -iname '*.exif' -o -iname '*.tiff' -o -iname '*.gif' -o -iname '*.bmp' -o -iname '*.png'

我得到了(我的测试用例是分布在不同目录中的300个图像,其中包含重复的文件和同名文件,但为了简化这个问题,这些文件都位于我的桌面上)。

Desktop/IMG_0316.PNG
Desktop/IMG_0191.JPG
Desktop/IMG_0292.JPG
Desktop/IMG_0269.PNG
Desktop/IMG_0318.PNG
Desktop/IMG_0172.JPG

当我添加cp命令时:
find Desktop/ -iname '*.JPG' -o -iname '*.jpeg' -o -iname '*.jf[il1]f' -o -iname '*.exif' -o -iname '*.tiff' -o -iname '*.gif' -o -iname '*.bmp' -o -iname '*.png' -exec cp -n {} test \;

我在测试中只获得以下文件:

Desktop/IMG_0316.PNG
Desktop/IMG_0269.PNG
Desktop/IMG_0318.PNG

我尝试从cp命令中删除“-n”选项,但没有任何区别。感谢任何帮助。

如果我添加echo,则会得到以下输出:

cp -n Desktop/IMG_0316.PNG test
cp -n Desktop/IMG_0269.PNG test
cp -n Desktop/IMG_0318.PNG test
1个回答

3

使用括号

find Desktop/ \( -iname '*.JPG' -o -iname '*.jpeg' -o -iname '*.jf[il1]f' -o -iname '*.exif' -o -iname '*.tiff' -o -iname '*.gif' -o -iname '*.bmp' -o -iname '*.png' \) -exec cp -n {} test \;

其实,-exec 是一种操作,而 -iname 则是一种谓词(在 man find 中的测试)。它们不能互换。默认操作是 -print。因此,你的表达式的含义是:
find Desktop -iname '*.JPG' -print \
    -o -iname '*.jpeg' -print -o ... -o -iname -iname '*.png' -exec cp...

使用括号可以将测试分组,并为整个组提供单个操作。


一切都是谓词。例如,您可以执行 find … -exec grep -qF foo {} \; -exec sed -i 's/foo/bar/' {} \; 仅在已包含“foo”的文件中将 foo 替换为 bar。(如果只执行 sed 部分,则会不必要地修改许多文件的 mtime。) - kojiro
我认为动作的“结果代码”可以用作测试,但我认为主题发起人并不希望以这种方式查找。尽管如此,你是正确的,这是一个有用的备注。 - user3159253

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接