在cp命令中使用if语句(cmp)的输出

时间:2017-12-01 14:36:17

标签: bash shell if-statement cp cmp

我正在尝试使用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语句的不同文件。

1 个答案:

答案 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这样的文件名,那么让他们不加引号就会破坏你的代码。