如何将 Linux 查找、转换和复制命令合并为一个命令

How to combine Linux find, convert and copy commands into one command

我有以下 cmd,它获取文件名中带有 STP 模式的所有 .pdf 文件并将它们放入文件夹中:

find /home/OurFiles/Images/ -name '*.pdf' |grep "STP*" | xargs cp -t /home/OurFiles/ImageConvert/STP/

我有另一个 cmd 可以将 pdf 转换为 jpg。

find /home/OurFiles/ImageConvert/STP/ -type f -name '*.pdf' -print0 |
  while IFS= read -r -d '' file
    do convert -verbose -density 500 -resize 800 "${file}" "${file%.*}.jpg"

    done

是否可以将这些命令合二为一?另外,如果可能的话,我想在单个命令中将前缀附加到转换后的图像文件名上。示例:STP_OCTOBER.jpg 到 MSP-STP_OCTOBER.jpg。非常感谢任何反馈。

可能是这样的:

find /home/OurFiles/Images -type f -name 'STP*.pdf' -print0 |
  while IFS= read -r -d '' file; do
      destfile="/home/OurFiles/ImageConvert/STP/MSP-$(basename "$file" .pdf).jpg"
      convert -verbose -density 500 -resize 800 "$file" "$destfile"
  done

与您的两个单独命令相比,此合并命令中唯一真正的新事物是使用 basename(1) 从文件名中删除目录和扩展名以创建输出文件名。

find /home/OurFiles/Images/ -type f -name '*STP*.pdf' -exec sh -c '
  destination=; shift        # get the first argument
  for file do                  # loop over the remaining arguments
    fname=${file##*/}          # get the filename part
    cp "$file" "$destination" && 
      convert -verbose -density 500 -resize 800 "$destination/$fname" "$destination/MSP-${fname%pdf}jpg"
  done
' sh /home/OurFiles/ImageConvert/STP {} +

您可以将目标目录和找到的所有 PDF 传递给 find-exec 选项以执行一个小脚本。
该脚本删除第一个参数并将其保存到变量 destination 中,然后循环遍历给定的 PDF 路径。对于每个文件路径,提取文件名,将文件复制到目标目录,如果复制操作成功,运行 convert 命令。