Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image Bash find-exec cp并非所有文件都被复制_Image_Bash_Copy_Find - Fatal编程技术网

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

Image Bash find-exec cp并非所有文件都被复制,image,bash,copy,find,Image,Bash,Copy,Find,我正在编写一个bash脚本来查找图像文件并将它们复制到dir。我的问题是,当我使用“查找”时,它会查找所有文件,但当我添加 -exec cp -n {} $2 \; 我知道我已经设置了DoNotClobber,但是我的测试用例考虑到了这一点,我也有一个重命名机制,稍后在脚本中进行了尝试和测试 当我直接进入终点站时,我也遇到了同样的问题 find Desktop -iname '*.JPG' -o -iname '*.jpeg' -o -iname '*.jf[il1]f' -o -iname

我正在编写一个bash脚本来查找图像文件并将它们复制到dir。我的问题是,当我使用“查找”时,它会查找所有文件,但当我添加

-exec cp -n {} $2 \;
我知道我已经设置了DoNotClobber,但是我的测试用例考虑到了这一点,我也有一个重命名机制,稍后在脚本中进行了尝试和测试

当我直接进入终点站时,我也遇到了同样的问题

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个不同目录下的图像,具有重复项和相同名称的文件,但为了解决这个问题,将其简化为桌面上的这些文件)

当我添加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,但没有任何效果 谢谢,谢谢你的帮助

如果我加上回声,我就得到了

cp -n Desktop/IMG_0316.PNG test
cp -n Desktop/IMG_0269.PNG test
cp -n Desktop/IMG_0318.PNG test
使用帕伦斯

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
是一个谓语(在语法方面的测试)。它们根本不能互换。默认操作是
-print
。你的意思是:

find Desktop -iname '*.JPG' -print \
    -o -iname '*.jpeg' -print -o ... -o -iname -iname '*.png' -exec cp...

通过使用parens,您的组测试和为整个组提供单个操作。

一切都是谓词。例如,您可以执行
find…-exec grep-qF foo{}-exec sed-i's/foo/bar/'{}\
仅在已包含“foo”的文件中用bar替换foo。(如果你只是做sed部分,你会不必要地修改许多文件的mtime。)我认为actions结果代码可以用作测试,但我认为主题初学者不希望使用find this方法。然而,你是对的,这是一个有益的评论。
find Desktop -iname '*.JPG' -print \
    -o -iname '*.jpeg' -print -o ... -o -iname -iname '*.png' -exec cp...