Bash find -exec cp并非所有文件都被复制

时间:2014-04-18 01:10:25

标签: image bash copy find

我正在编写一个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 个答案:

答案 0 :(得分:3)

使用parens

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...

通过使用parens您的小组测试并为整个小组提供单一操作。