2

У меня есть базовые знания сценариев оболочки.

У меня есть фотографии в original папке на многих разных папках, как это

folder
  + folder1
    + original
  + folder2
    + original
  + folder3
    + original
  + folder4
    + original

Используя mogrify я пытаюсь создать большие пальцы в папке thumb следуя структуре к этому.

folder
  + folder1
    + original
    + thumb
  + folder2
    + original
    + thumb
  + folder3
    + original
    + thumb
  + folder4
    + original
    + thumb

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

2 ответа2

4

Вместо использования цикла for, где у вас будут проблемы, если в любом из путей к файлам есть пробелы, вы можете использовать find для рекурсивного просмотра каталога и выполнения действий со всеми файлами, имена которых соответствуют шаблону. Если все файлы должны быть затронуты, просто опустите опцию -name или настройте ее так, чтобы она подходила.

find /path/to/directory -type f -name "*.png" -exec mogrify {} +

Чтобы лучше использовать параметры mogrify, вы можете использовать xargs.

find /path/to/directory -type f -name "*.png" | xargs mogrify -path /path/to/thumbnails
1

Я почти уверен, что вы увидите множество вариантов ответов, которые вы получите. Есть более чем несколько способов сделать это. Следующий подход просто использует ls для вывода списка каталогов в текущем каталоге. Затем он переходит в этот каталог, чтобы получить список файлов PNG (изменить в соответствии с требованиями). Для каждого из файлов png вызывается mogrify.

В основном вам нужно

  1. Скопируйте это в текстовый редактор.
  2. Измените строку, содержащую команду mogrify, для соответствия.
  3. Для простоты сохраните его в виде простого текстового файла в каталог, в котором вы хотите его запустить.
  4. Установите бит выполнения для файла с помощью chmod +x /path/to/scriptname
  5. Запустите его из каталога с ./scriptname

Сценарий ниже:

DIRS="$(find . -mindepth 1 -maxdepth 2 -type d)"

for d in $DIRS
do
    cd $d
    FILES="$(find . -name '*.png')"
    for f in $FILES
    do
    mogrify -path ./thumbnails/ $f
    done
    cd ..
done

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