Сценарий Bash дает предупреждения / ошибки, хотя он работает так, как ожидалось. Как я могу редактировать, чтобы удалить предупреждения / ошибки?

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

#!/bin/bash for i in $(find . -type d) do convert "${i}/*jpg" "${i}/*png" "${i}/*tif" "${i}/*tiff" "${i}.pdf" done

Пример ошибок ниже ..

convert: unable to open image `./*jpg': No such file or directory @ error/blob.c/OpenBlob/2712. convert: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501. convert: unable to open image `./*png': No such file or directory @ error/blob.c/OpenBlob/2712. convert: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501. convert: unable to open image `./*tif': No such file or directory @ error/blob.c/OpenBlob/2712.

И так далее и т. Д. Для каждого каталога, содержащего изображения.

1
задан 27 July 2017 в 21:23

4 ответа

Проблема заключается в том, что если вы столкнулись с каталогом без подходящих файлов изображений, glob передается без изменений в команду convert, поэтому вы пытаетесь преобразовать файлы с буквальным именем ./*jpg, ./*png и т. д. [ ! d0]

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

Я не могу придумать более элегантный способ справиться с этим, кроме настройки nullglob, расширяя globs в массиве, а затем явно проверяя, является ли массив пустым или нет. Так, например:

find $PWD -type d -execdir bash -c ' shopt -s nullglob files=("$1"/*.jpg "$1"/*.png) if (( ${#files[@]} == 0 )); then echo "$1: nothing to do here" else convert "${files[@]}" "$1.pdf" fi' bash {} \;

или более компактно

find $PWD -type d -execdir bash -c ' shopt -s nullglob files=("$1"/*.jpg "$1"/*.png) (( ${#files[@]} == 0 )) || convert "${files[@]}" "$1.pdf" ' bash {} \;

или, взяв @ Zanna и упустив find в целом:

#!/bin/bash shopt -s globstar shopt -s nullglob for f in **/*; do [[ -d "$f" ]] || continue files=( "$f"/*.jpg "$f"/*.png ) (( ${#files[@]} != 0 )) || continue convert "${files[@]}" "$f.pdf" done
1
ответ дан 18 July 2018 в 11:01

Ошибки вызваны отсутствием соответствующих файлов. Но не анализируйте вывод find - вместо этого используйте globstar и тест.

shopt -s globstar for i in **; do [[ -d "$i" ]] && convert "$i"/*jpg "$i"/*png "$i"/*tif "$i"/*tiff "$i".pdf 2>/dev/null done shopt -u globstar
0
ответ дан 18 July 2018 в 11:01

Проблема заключается в том, что если вы столкнулись с каталогом без подходящих файлов изображений, glob передается без изменений в команду convert, поэтому вы пытаетесь преобразовать файлы с буквальным именем ./*jpg, ./*png и т. д. [ ! d0]

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

Я не могу придумать более элегантный способ справиться с этим, кроме настройки nullglob, расширяя globs в массиве, а затем явно проверяя, является ли массив пустым или нет. Так, например:

find $PWD -type d -execdir bash -c ' shopt -s nullglob files=("$1"/*.jpg "$1"/*.png) if (( ${#files[@]} == 0 )); then echo "$1: nothing to do here" else convert "${files[@]}" "$1.pdf" fi' bash {} \;

или более компактно

find $PWD -type d -execdir bash -c ' shopt -s nullglob files=("$1"/*.jpg "$1"/*.png) (( ${#files[@]} == 0 )) || convert "${files[@]}" "$1.pdf" ' bash {} \;

или, взяв @ Zanna и упустив find в целом:

#!/bin/bash shopt -s globstar shopt -s nullglob for f in **/*; do [[ -d "$f" ]] || continue files=( "$f"/*.jpg "$f"/*.png ) (( ${#files[@]} != 0 )) || continue convert "${files[@]}" "$f.pdf" done
1
ответ дан 24 July 2018 в 19:42
  • 1
    Это прекрасно работает (второй скрипт). Как я могу добавить в сценарий следующие форматы изображений? .tif & amp; .tiff – Ben Robins 27 June 2017 в 19:12
  • 2
    Самый простой способ @BenRobins - просто добавить их в список files=( ), например. files=( "$f"/*.jpg "$f"/*.png "$f"/*.tif "$f"/*.tif) (есть более сложные способы использования расширенных глобусов ) – steeldriver 27 June 2017 в 20:06

Ошибки вызваны отсутствием соответствующих файлов. Но не анализируйте вывод find - вместо этого используйте globstar и тест.

shopt -s globstar for i in **; do [[ -d "$i" ]] && convert "$i"/*jpg "$i"/*png "$i"/*tif "$i"/*tiff "$i".pdf 2>/dev/null done shopt -u globstar
0
ответ дан 24 July 2018 в 19:42
  • 1
    Спасибо за это. к сожалению, он производит точно такие же ошибки, например; convert: unable to open image CRYSTAL_BLACK_SILICA/*png: No such file or directory @ error/blob.c/OpenBlob/2712. convert: no decode delegate for this image format @ error/constitute.c/ReadImage/501. он также не принимает имя подкаталогов, в которые хранятся файлы изображений, как имя .pdf, как и исходный скрипт – Ben Robins 27 June 2017 в 18:30
  • 2
    @BenRobins Исправлена ​​последняя часть - я понимаю, что ошибки связаны только с тем, что эти каталоги не содержат совпадающих файлов. Поэтому, вероятно, было бы лучше отказаться от ошибок ... не могу придумать простой способ проверить, существуют ли они и объединить данные в одно и то же время. Я отредактировал свой ответ, но я удалю его, когда я уверен, что вы его видели, поскольку он не очень полезен – Zanna 27 June 2017 в 18:42
  • 3
    @BenRobins Ха-ха не беспокоится :) это не умно, хотя это просто обманывать, чтобы выбросить ошибки. Steeldriver показывает умные способы – Zanna 27 June 2017 в 18:51
  • 4
    На данный момент это решение работает для меня с практической точки зрения (оно работает и его то, что мне нужно использовать несколько раз в день). Однако я буду экспериментировать с методом Steeldrivers выше с точки зрения обучения, чтобы надеяться на более элегантный подход. – Ben Robins 27 June 2017 в 18:53

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

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