Команда «find» -exec заменяет строку

1

Я пытаюсь найти файлы 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если действие get ani file сохраняет маршрут в переменной, file
oldfile=${file##*/};извлекает файл pat и сохраняет имя файла в переменной, oldfile
olddir=${file/"$oldfile"/""};вынимает имя файла чтобы сохранить olddir
pdfdir=${file/'./''./PDF'};изменения в патте ./ в ./pdf и сохранить новый пат в pdfdir
pdfdir=${pdfdir/"$oldfile"/""};извлекать имя файла, чтобы сохранить pdfdir
savedir=${file/'./''./OLD'};изменения в патте в PDF ./ в ./old и сохранить новый пат в savedir
savedir=${savedir/"$oldfile"/""};вынуть имя файл для сохранения патта pdf в файле savedir
newfile=${oldfile/.[Jj][Pp][Gg]/.pdf};сохранить имя нового файла, который будет создан при newfile
mogrify -format pdf "$file";конвертации в filepdf
mkdir -p "$pdfdir";создать каталоги патта pdfdir
mkdir -p "$savedir";создать каталоги патта savedir
mv -- "$olddir$newfile" "$pdfdir$newfile";переместить новый файл pdf создать в каталог pdf mv -- "$olddir$oldfile" "$savedir$oldfile";переместить старый файл jpg в старый каталог и doneзавершить процесс

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

Алехандро О'Бирн
источник
mogrify имеет флаг -o для выходного местоположения? немного упростит код Кроме того, какую ОС вы используете? точнее какая оболочка? С помощью find мы можем принять оболочку Linux?
Богатая гомолка
Рич, я использую bash даже в mac, как и в linux, без mogrify его нет.
Алехандро О'Бирн
@ AlejandroO'Byrne Пожалуйста, опубликуйте решение как ответ, а не редактируйте текст своего вопроса (Вы можете ответить на свой вопрос ). Даже вы можете принять ответ , который работает для вас.
αғsнιη

Ответы:

2
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.

mpez0
источник
Спасибо, немного изменившись, я получаю решение от вашего предложения. СПАСИБО
Алехандро О'Бирн
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-файлы, если вам не нужно их сохранять (надеюсь, вам не нужна эта команда по буквам).

AFH
источник
это не работает
Алехандро О'Бирн
Что не работает? Я проверил обе команды с одним файлом во временном каталоге. Возможно, структуру каталогов нужно создавать заранее, используя find . -type d -exec mkdir new/'{}' \;. Обратите внимание, что это создаст каталоги, даже если в нем нет файла JPEG. Это должно быть намного сложнее, но вы всегда можете удалить пустые каталоги с помощью find new/ -type d -exec rmdir '{}' \;.
AFH