Как объединить Linux найти, преобразовать и скопировать команды в одну команду - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть следующий cmd, который выбирает все файлы .pdf с шаблоном STP в имени файла и помещает их в папку:

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. Любая обратная связь высоко ценится.

Ответы [ 2 ]

1 голос
/ 21 апреля 2020
find /home/OurFiles/Images/ -type f -name '*STP*.pdf' -exec sh -c '
  destination=$1; 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, если операция копирования прошла успешно.

1 голос
/ 21 апреля 2020

Может быть что-то вроде:

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) для удаления каталогов и расширения из имя файла для создания выходного имени файла.

...