Практическое руководство рекурсивно создает PDF thumnbails на командной строке Linux

Маленькое дальнейшее расследование узнало, что базовые версии хранятся в источнике ядра в /usr/src/etc.

Так CP /usr/src/etc/rc.d/rtadvd /etc/rc.d/rtadvd решенный мои проблемы.

2
02.10.2016, 16:18
3 ответа

Попробуйте это:

find /source/directory -name "*.pdf" -exec \ sh -c 'convert -thumbnail x80 {} $(dirname {})/thumb_$(basename {})' \;

Я должен был изменить его немного к:

find /source/directory -name "*.pdf" -exec \ sh -c 'convert -thumbnail x80 {} $(dirname {})/thumb_$(basename {} .pdf)'.png \;

Чтобы иметь базовое имя разделяют filextension и затем добавляют .png.

Благодаря всем ответам. Этот работал хорошо на меня!

0
27.01.2020, 22:14
  • 1
    я должен был изменить его к: find /source/directory -name "*.pdf" -exec \ sh -c 'convert -thumbnail x80 {} $(dirname {})/thumb_$(basename {} .pdf)'.png \; чтобы иметь базовое имя разделяют fileext. Благодаря всем ответам этот работал лучше всего на меня! –  fibble 06.02.2013, 17:53
  • 2
    Осуществление читателю: что происходит, если существует названный файл $(rm -rf /).pdf где-нибудь там. справедливое замечание –  Stéphane Chazelas 06.02.2013, 18:08
  • 3
    @StephaneChazelas: Положительная сторона. Я должен был первоначально добавить "sh-c..." для передавания имени файла правильно базовому имени / dirname команды, но это открыло эту дыру в системе безопасности. При выполнении этого на недоверяемом каталоге можно заменить {} с '\''{}'\'', однако Вы сталкиваетесь с той же проблемой, если файл называют '$(evil_command)'. Не уверенный в корректном способе закрыть этого. –  Derek Pressnall 06.02.2013, 19:48

Хитрая часть не должна иметь имени файла формы testfile.pdf.png как вывод. Несколько лет назад я имел ту же проблему и решил ее с этим сценарием помощника (адаптировался немного):

#!/bin/bash 
SRCFRM=pdf
TGTFRM=png
FILE=$1

NEWFILE=$(echo $FILE | sed "s:$SRCFRM\$:$TGTFRM:")
convert -thumbnail x80 $FILE[0] $NEWFILE

Сохраните его где-нибудь, например, в Вашем домашнем dir, затем используйте его как это:

find /path -name '*.pdf' -exec /path/to/converthelper.sh {} \;
1
27.01.2020, 22:14

Вы хотите

  • Рекурсивно вызовите в весь PDFs:

    1. Включите globstar, с shopt -s globstar.
    2. Используйте его для генерации списка весь *.pdf файлы под текущим каталогом: **/*.pdf
    3. Создайте цикл, который выполняет итерации по упомянутым файлам:

      for filename in **/*.pdf
      do
          something
      done
      
  • Теперь, Вы хотите сделать что-то на файлах: что-то convert -thumbnail x80 95.pdf[0] thumb_95.png. Существует несколько путей: Я обычно использую basename, в этом случае Вам было бы нужно $(dirname $filename)/$(basename $filename .pdf).png, но другой интересный (и более простой) подход должен использовать инструменты обработки строк удара:

    1. Удалить .pdf от конца имени файла: ${filename%.pdf}
    2. Добавить .png: ${filename%.pdf}.png

Наконец, мы можем склеить все это (не забывайте, что это требует globstar, shopt -s globstar):

for filename in **/*.pdf
do
    convert -thumbnail x80 $filename[0] ${filename%.pdf}.png
done
1
27.01.2020, 22:14

Теги

Похожие вопросы