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

Using the output of if statement (cmp) in a cp command

我正在尝试使用 if 语句的输出作为 cp 命令的输入,但它似乎不起作用。我的代码是:

for fname in $(find  -name "IMG_[0-9][0-9][0-9][0-9].JPG")
do
  filename=$(basename $fname)
  if cmp /$filename $fname; then 
    cp $fname /$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 后缀,这样它们就不会覆盖 </code> 中的现有文件,但是它会复制文件夹 [=] 中的所有文件14=] 到文件夹 <code>,同时给它们 .JPG 后缀,所以现在我没有拥有不同文件的副本,而是拥有相同文件的副本,只是它们具有后缀 .JPG

我认为cp语句是不正确的,因为cmp只给出了文件之间的差异,如果有差异则执行cp。我已经用 for 循环复制了文件,现在我正在尝试重命名和复制具有相同 for 但带有 if 语句的相同名称的不同文件。

您实际上并不关心 cmp 输出 ,只关心它的退出状态。如果退出状态不为零,则文件不同,您可能想要进行复制。另外,不要在这里打扰find

shopt -s globstar
for source in ""/**/IMG_[0-9][0-9][0-9][0-9].JPG; do
   filename=$(basename "$source")
   target="/$filename"
   if ! cmp -s "$source" "$target"; then
       cp "$source" "$target"
   fi
   # cmp -s "$source" "$target" || cp "$source" "$target"
done

! 否定退出状态,因为 if 如果条件的退出状态为零则执行主体。由于您想在 cmp 具有 非零 退出状态时执行,因此我们首先将其取反。

请务必引用所有参数扩展。如果您碰巧有一个像 /more files/IMG_9342.JPG.

这样的文件名,那么将它们不加引号会破坏您的代码