我正在尝试使用if语句的输出作为cp命令的输入,但它似乎不起作用。我的代码是:
for fname in $(find $1 -name "IMG_[0-9][0-9][0-9][0-9].JPG")
do
filename=$(basename $fname)
if cmp $2/$filename $fname; then
cp $fname $2/$filename.JPG
fi
我得到的输出是
lel//IMG_0039.JPG dir/dir2/IMG_0039.JPG differ: byte 212, line 1
lel//IMG_2317.JPG dir/dir/IMG_2317.JPG differ: byte 212, line 1
并且我只想复制这两个文件,同时给它们.JPG
后缀,因此它们不会覆盖$2
中的现有文件,但会复制文件夹{{}中的所有文件1}}到文件夹$1
,同时为它们提供$2
后缀,所以现在不是拥有相同文件的副本,而是只拥有相同文件的副本.JPG
< / p>
我认为.JPG
语句不正确,因为cp
仅提供文件之间的差异,然后如果存在差异则执行cmp
。我已经使用cp
循环复制了文件,现在我正在尝试使用相同的for
重命名和复制具有相同名称但使用if语句的不同文件。
答案 0 :(得分:3)
您实际上并不关心cmp
的输出,只关注其退出状态。如果退出状态为非零,则文件不同,您可能希望进行复制。另外,请不要在这里打扰find
。
shopt -s globstar
for source in "$1"/**/IMG_[0-9][0-9][0-9][0-9].JPG; do
filename=$(basename "$source")
target="$2/$filename"
if ! cmp -s "$source" "$target"; then
cp "$source" "$target"
fi
# cmp -s "$source" "$target" || cp "$source" "$target"
done
!
否定退出状态,因为如果条件的退出状态为零,则if
执行正文。由于您希望在cmp
具有非零退出状态时执行,我们会先取消它。
请务必引用所有参数扩展。如果你碰巧有一个像$1/more files/IMG_9342.JPG
这样的文件名,那么让他们不加引号就会破坏你的代码。