Скрипт Bash читает строки из файла с исключениями

Это, без сомнения, будет просто для кого-то, но я ни в коем случае не волшебник bash. Я стремлюсь учиться, когда мне нужно что-то сделать. У меня есть скрипт, который оптимизирует изображения и требует только, чтобы он вызывался с папкой изображений в качестве аргумента. Он определит, какие файлы можно использовать, а также будет перемещаться по каждой подпапке.

Я создал простой цикл, который читает строки (пути к папкам с изображениями) из txt-файла и передает их в сценарий оптимизации по одному. Моя проблема в том, что некоторые из деревьев папок содержат ветку папок и подпапок, которую я хочу пропустить, скажем, кеш, который содержит зеркало структуры папок с изображениями. Мне нужен способ легко добавить это имя папки, скажем, в исключающий текстовый файл, и заставить цикл bash игнорировать это и все, что находится под ним.

Вот цикл:

#!/bin/bash
filename='imgopt_sites.txt'

while read p; do 
    nice -n 10 bash /usr/local/bin/imgopt.sh $p > /dev/null 2>&1
done < $filename

Вот текстовый файл с папками для запуска:

/srv/www/domain1.com/htdocs/wp-content/uploads
/srv/www/domain2.com/htdocs/wp-content/uploads
/srv/www/domain3.com/htdocs/wp-content/uploads
/srv/www/domain4.com/htdocs/wp-content/uploads
/srv/www/domain5.com/htdocs/wp-content/uploads
/srv/www/domain6.com/htdocs/image

Примером того, что будет исключено, будет:

/srv/www/domain6.com/htdocs/image/cache (and all under that)

Это может быть в другом текстовом файле, и его нужно будет зациклить, так как будет больше. Или, если есть простой способ поместить их все в один файл и как-то отличить исключающие строки, это тоже подойдет. Я искал, и ничто, что я нашел, действительно не поражает это. Благодарю.

ОС - Ubuntu 14.04, и цикл вызывается заданием cron.

Наконец, вот пример дерева каталогов, чтобы дать перспективу:

/srv/www/domain6.com/htdocs/image
├── cache
│   ├── catalog
│   │   ├── apparel
│   │   ├── art
│   │   ├── banners
│   │   ├── commission
│   │   ├── demo
│   │   │   ├── banners
│   │   │   └── manufacturer
│   │   ├── illustrations
│   │   ├── jewelry
│   │   ├── misc
│   │   ├── news
│   │   ├── pen_ink
│   │   └── sample_data
│   │       ├── gallery
│   │       ├── logos
│   │       ├── patterns
│   │       ├── payments
│   │       └── slider
│   └── tb
├── catalog
│   ├── apparel
│   ├── art
│   ├── banners
│   ├── commission
│   ├── illustrations
│   ├── jewelry
│   ├── misc
│   ├── news
│   ├── pen_ink
│   └── sample_data
│       ├── banners
│       ├── features
│       ├── gallery
│       ├── logos
│       ├── patterns
│       │   └── _original
│       ├── payments
│       ├── slider
│       └── wallpaper
├── data
│   └── productimage
├── flags
└── templates

Любые предложения приветствуются.

Обновление: это фрагмент кода в самом скрипте, который обрабатывает входные каталоги.

do_dir () {
  # $1 is name of dir
  local ret_val="0"
  while IFS= read -r -u 3 -d $'\0' file; do
    do_file "${file}"
    ret_val=$?
    done 3< <(find "${1}" -type f \( -iregex '.*\.[jp][pn]g$' -o -iregex '.*\.jpeg$' \) -print0)
  return $ret_val
}

Я немного озадачен тем, что делает "-u 3".

Обновление 2: новая версия цикла с ошибками в ответ на @shellter

#!/bin/bash

filename='imgopt_sites.txt'
excludes='imgopt_excludes.txt'

set -vx; while read p ; do nice -n 10 bash /usr/local/bin/imgopt/imgopt-ng.sh -new -progressive -sqlite $p; done <( grep -v -F -f "$excludes" "$filename" )

Ошибка:

/usr/local/bin/imgopt/imgopt_loop.sh: line 6: syntax error near unexpected token `<( grep -v -F -f "$excludes" "$filename" )'
/usr/local/bin/imgopt/imgopt_loop.sh: line 6: `set -vx; while read p ; do nice -n 10 bash /usr/local/bin/imgopt/imgopt-ng.sh -new -progressive -sqlite $p; done <( grep -v -F -f "$excludes" "$filename" )'

0 ответов

Другие вопросы по тегам