Я пытаюсь найти файлы JPG в дереве папок, чтобы выполнить команду "", чтобы преобразовать их в PDF.

Проблема в том, что код, который я запускаю, оставляет файл в той же директории, и я хочу переместить его, но сохранить структуру дерева файлов.

Что я пробовал до сих пор:

find . -iname '*.jpg' -exec mogrify -format pdf '{}' \;

Эта команда работает отлично. Я хочу манипулировать "{}", перемещая часть его содержимого;

{} = ./1/aa.xxx

и я хочу преобразовать его в:

{} = ./new/1/aa.pdf

благодаря @ mpez0 я могу немного измениться и найти решение:

find . -iname '*.jpg' | while read file ; do 
oldfile=${file##*/};
olddir=${file/"$oldfile"/""};
pdfdir=${file/'./''./PDF'};
pdfdir=${pdfdir/"$oldfile"/""};
savedir=${file/'./''./OLD'};
savedir=${savedir/"$oldfile"/""};
newfile=${oldfile/.[Jj][Pp][Gg]/.pdf};
mogrify -format pdf "$file"; 
mkdir -p "$pdfdir";
mkdir -p "$savedir";
mv -- "$olddir$newfile" "$pdfdir$newfile"; 
mv -- "$olddir$oldfile" "$savedir$oldfile"; 
done

что этот код делает:
find . -iname '*.jpg' найти все файлы, которые заканчиваются JPG и JPG
while read file ; do если действие получить ани файл сохранить маршрут в file переменной
oldfile=${file##*/}; вынуть файл pat и сохранить имя файла в переменной oldfile
olddir=${file/"$oldfile"/""}; выньте имя файла для сохранения патта в olddir
pdfdir=${file/'./''./PDF'}; измените ./ на ./pdf и сохраните новый пат в pdfdir
pdfdir=${pdfdir/"$oldfile"/""}; выньте имя файла, чтобы сохранить файл pdf в pdfdir
savedir=${file/'./''./OLD'}; измените ./ на ./old и сохраните новый патт в savedir
savedir=${savedir/"$oldfile"/""}; выньте имя файла, чтобы сохранить файл pdf в savedir
newfile=${oldfile/.[Jj][Pp][Gg]/.pdf}; сохранить имя нового файла, который будет создан в newfile
mogrify -format pdf "$file"; преобразовать file в PDF
mkdir -p "$pdfdir"; создайте каталоги с pdfdir
mkdir -p "$savedir"; создать savedir
mv -- "$olddir$newfile" "$pdfdir$newfile"; переместите новый pdf файл create в pdf каталог mv -- "$olddir$oldfile" "$savedir$oldfile"; переместить старый файл jpg в старый каталог done завершить процесс

Я надеюсь, что это поможет другим

2 ответа2

1
find . -iname '*.jpg' | while read f ; do 
    new=`echo $f | sed -e 's/\.[Jj][Pp][Gg]$/.pdf/'`; 
    newd=`dirname $f`;
    newd="new/$newd" 
    mogrify -format pdf $f; 
    mv $new $newd; 
done

Конечно, я рекомендую запустить скрипт, повторяющий команды mogrify и mv . Если mogrify предлагает вариант вывода, используйте его вместо mv. Возможно, вам будет проще найти и выполнить все преобразования mogrify , а затем собрать новые файлы .pdf .

1

Если вы используете convert вместо mogrify (часть того же набора), ваша команда становится:

find . -iname '*.jpg' -exec convert -format pdf '{}' new/'{}'.pdf \;

В отличие от mogrify , использование convert не создает обновленное расширение файла, поэтому вы получите .jpg.pdf (плюс заглавные буквы) в качестве нового расширения файла, но это легко изменить с помощью rename:

find new -iname '*.jpg.pdf' -exec rename 's/\.[Jj][Pp][Gg]//' '{}' \;

После этого вы можете удалить JPEG-файлы, если вам не нужно их сохранять (надеюсь, вам не нужна эта команда по буквам).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .