Скрипт 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" )'