Если кто-либо может указать на меня на направление того, где я могу узнать больше об этом типе работы, я ценил бы его. Я имею некоторый опыт при сценариях с php больше, чем что-нибудь и работал над изучением Linux (сервер Ubuntu CLI через SSH и SFTP для движущихся файлов в и из моего VM).
Попытка к повторным изображениям пакетной обработки в нескольких каталогах. Я использую imagemagick, который работает над одним файлом за один раз.
Я хотел бы за это выполнить запуск в главном каталоге и затем сделать это задание во все jpg файлы, которые может найти сценарий.
псевдо код -
for all folders in the directory
open folder
check if folder "drawings" (if !exists) then {start the loop over} else :
open drawings folder
for each file in drawings
if file is a jpg
run this program on it (convert image.jpg -crop 713x470+5+3 output.jpg)
Вычисленный то, что я должен был сделать мудрый циклом, просто должно было получить подвешивание синтаксис цикла . Надежда это помогает кому-то еще, который, возможно, должен был бы циклично выполниться через подкаталог на основе, он - имя.
for dir in */
do
for subdir in $PWD/"$dir"*/
do
if [ "$subdir" == $PWD/"$dir""Drawings"*/ ]
then
for file in "$subdir"*.jpg
do
rm "$file"
done
for file in "$subdir"*.pdf
do
newName="${file/.pdf/}"
convert -density 200 "$file" -append -resize 850 -background white -flatten "$newName".jpg
done
for file in "$subdir"*.jpg
do
newName="${file/.jpg/}"
if [[ "$file" == *"insulation"* ]]
then
convert "$file" -crop 820x710+15+97 "$newName-cropped.jpg"
else
convert "$file" -crop 820x870+15+79 "$newName-cropped.jpg"
fi
done
fi
done
done
exit 0
Это - то, что я придумал
#!/bin/bash
dnames=$(for i in $(ls -d $1*/); do echo ${i}; done)
if [ "$#" -eq "1" ]; then
for dir in $dnames
do
cd $1
cd $dir
if [ -d "drawings" ]; then
cd drawings
jpgfiles=$(ls -p | grep -v / | awk '/.jp[e]?g/{print $0}')
if [ -z "$jpgfiles" ]; then
echo "Directory drawings exist in $dir but no .jpg images were found"
else
for jpgs in $jpgfiles
do
echo "found $jpgs in ${dir}drawings" #convert $jpgs -crop 713x470+5+3 output.jpg
done
fi
else
echo "Directory drawings cannot be found in $dir"
fi
done
else
echo "A full path to the directory must be given"
echo "For instance, /home/user1/Pictures/"
fi
Это должно быть выполнено с одним параметром, в котором параметр является полным путем к каталогу. Например, если я собираюсь искать ту папку рисунков, которая может быть расположена в подкаталоге в моем/home/joram/каталоге
Это было бы похоже на это
myprogram /home/joram/
Программные циклы в/home/joram/через все каталоги это содержит. Затем это посещает каждый каталог в/home/joram/в надежде на нахождение подпапки рисунков. Когда программа находит папку рисунков, которая содержит изображения .jpg, команды инициированы. После окончания команд программа продолжает цикл, пока все каталоги проверяются.
Пример вывода программы:
#Directory drawings cannot be found in /home/joram/Desktop/
#Directory drawings cannot be found in /home/joram/Documents/
#Directory drawings exist in /home/joram/Downloads/ but no .jpg images were found
#Directory drawings cannot be found in /home/joram/Music/
#Directory drawings cannot be found in /home/joram/my_scripts/
#found test2.jpeg in /home/joram/Pictures/drawings
#found test.jpg in /home/joram/Pictures/drawings
#Directory drawings cannot be found in /home/joram/Public/
Примечание: В он - текущая форма, программа просто печатает .jpg файлы, это нашло и дает некоторую другую информацию также (Никакие другие инициированные команды). Таким образом, это может быть протестировано прежде, чем сделать фактическую вещь. Чтобы заставить программу добраться, что Вы хотите, удалите часть эха и не прокомментируйте команду на строке 16 (Если это - фактическая команда, Вы хотите работать).
Улучшения могли быть сделаны, надежда, это помогает Вам так или иначе!
Алгоритм должен быть точно тем же, или Вы просто заботитесь о результате? Поскольку я думаю, что Вы могли создать намного короче и более легкий код, если Вы используете find
для обхода каталога и поиска:
find /path/to/search-root -path '*/drawings/*.jpg' -execdir convert -crop 713x470+5+3 {} output.jpg \;
Это найдет все *.jpg
файлы, которые являются (главные-) дети названных каталогов drawings
и выполненный convert
команда на них. Последние продукты файл output.jpg
в том же каталоге как исходный файл. Если существует несколько исходных файлов в том же каталоге предыдущее output.jpg
экземпляр будет перезаписан.
Если Вы хотите хотеть различные, “уникальные” имена выходного файла относительно не, перезаписывают предыдущие результаты, необходимо будет преобразовать имя выходного файла так или иначе. К сожалению, find
не может сделать этого, но мы можем делегировать ту задачу к оболочке. Существует несколько способов достигнуть этого, хотя я обычно предпочитаю канал a while read
цикл, потому что это является менее раздражающим, чем выход из специальных символов:
find /path/to/search-root -path '*/drawings/*.jpg' -print0 |
while IFS= read -rd '' f; do
convert -crop 713x470+5+3 "$f" "${f%.*}.output.jpg"
done
(Это требует оболочки с поддержкой read -d
как Bash. При необходимости в более портативной альтернативе, скажите так.)