Переменные, вызываемые оператором if, дают -bash: «Команда не найдена»

Лучший способ, который я там нашел, без потери качества, убирает тени, шумы,текст со следующей страницы просвечивается и т.д.:

  1. Сначала конвертируйте pdf в отдельные изображения

    pdfimages combined_ocr.pdf page

  2. Во-вторых, удалить тени, шум, текст со следующей страницы, истекающие кровью через (кредиты в этот блог)

    ls./p*.ppm | xargs -L1 -I {} convert {} -quality 100 -density 300 -fill white -fuzz 80% +opaque "#000000" {}.jpg

это можно добавить либо как дополнительный -шаг, либо вместо приведенной выше команды, чтобы фактически получить только два цвета:

ls./p*.ppm | xargs -L1 -I {} convert {} +dither -colors 2 -type bilevel -density 300 -fill white -fuzz 40% +opaque "#000000" -density 300 {}.jpg

50 -60% процентов fuzzменее агрессивен и дает более читаемые результаты:

ls./p*.ppm | xargs -L1 -I {} convert {} +dither -colors 2 -type bilevel -density 300 -fill white -fuzz 40% +opaque "#000000" -density 300 {}.jpg
  1. Это делается для создания pdf-файла из каждого jpg-изображения без потери разрешения или качества:

    ls -1./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf

  2. Это позволяет объединить страницы PDF в одну:

    pdftk *.pdf cat output combined.pdf

  3. И, наконец, я добавляю текстовый слой с OCR, который не меняет качество сканирования в PDF-файлах, чтобы их можно было найти:

    pypdfocr combined.pdf

0
16.02.2020, 22:41
3 ответа

Следующая строка не имеет смысла:

PRINT=$("ipy.log was cleared at ${TIMESTAMP} on ${WEEKDAY} the ${DAY}${TAG}  of  ${MON},  ${YEAR}")

синтаксис $(...)предназначен для подстановки команды , поэтому bashпытается выполнить:

ipy.log was cleared at ${TIMESTAMP} on ${WEEKDAY} the ${DAY}${TAG}  of  ${MON},  ${YEAR}

как команду.

Вместо этого вы могли бы:

  • установить переменную PRINTв строку:
PRINT="ipy.log was cleared at ${TIMESTAMP} on ${WEEKDAY} the ${DAY}${TAG}  of  ${MON},  ${YEAR}"
  • echoстрока на терминал:
echo "$PRINT"
  • echoстрока в файл:
echo "$PRINT" > ~/ipy.log

Присвоение PREVне работало должным образом, поскольку ~/days.logбыл бы существующим, но пустым файлом из-за ошибки:

${WEEKDAY} > ~/days.log

что должно было быть:

echo "$WEEKDAY" > ~/days.log

Здесь немного другой подход:

# This function clears ipy.log every seven or more days
function clear_ipylog() {
    typeset -i prev yearmday dif
    typeset tag timedate message
    typeset -g marker
#     read -r prev <"$HOME/days.log" # Should work instead of awk as days.log should only contain '%Y%m%d'
    prev=$(awk '/./{line=$0} END{print line}' "$HOME/days.log")
    echo $prev >&2
    yearmday=$(date '+%Y%m%d')
    echo $yearmday >&2
    dif=$((yearmday-prev))
    if [ $dif -gt 6 ]; then
        case ${yearmday:6:2} in
            (01) tag='st' ;;
            (02) tag='nd' ;;
            (03) tag='rd' ;;
            (*) tag='th' ;;
        esac
        timedate=$(date '+%H:%M:%S %F%b')
        message=$(printf '%s %d%s\n' "ipy.log was cleared at ${timedate:0:19}, the" \
            "${yearmday:6:2}" "$tag of ${timedate:19} ${yearmday:0:4}")
        echo "$message" > "$HOME/ipy.log"
        echo "$message" >&2
        echo $yearmday > "$HOME/days.log"
        marker='true'
    else
        echo "It has been $dif days since your last write, no need to clear logs"
        marker='false'
    fi
}
clear_ipylog
  • Это функция для изоляции некоторых переменных — я предполагаю, что вы не хотите, чтобы $prev, $difи т. д. устанавливались как глобальные переменные
  • Не уверен, для чего предназначен $marker, поэтому предположим, что вы хотите установить его как глобальную переменную
  • ~/.bash_profile,~/.bashrcчитаются непосредственно bash, поэтому не следует начинать со строки #!/bin/shили устанавливать исполняемый режим
  • .
  • Возможно, вы захотите сделать ~/days.logустаревшим, изменив формат первой строки ~/ipy.log, чтобы prevможно было взять из первой строки/поля ipy.log
  • .
0
28.04.2021, 23:23

В строке 15 вы:

WEEKDAY=$(date '+%Y%m%d')

Таким образом, WEEKDAY == "20200216" или аналогичный. В строке 41 вы:

${WEEKDAY} > ~/days.log

, который заменит ${WEEKDAY}на «20200216». В bash первая строка, которую вы даете, всегда является командой (, за исключением :ключевых слов, назначений и других вещей, но вы можете забыть об этом на данный момент ). Так что bashпопытается казнить:

20200216

которого не существует. Вы наверное хотели написать:

echo "${WEEKDAY}" > ~/days.log

вместо этого.

3
28.04.2021, 23:23

Поскольку вы используете арифметическую операцию в строке 20 "DIF=$ ((WEEKDAY -PREV ))", я думаю, что лучше всего будет, если строка 22 будет читать:

22 if [ ${DIF} -gt 6 ]; then

Кроме того, как ранее указывал Томаш Поспишек, строка 40, а также 41 нуждаются в команде перед переменными и, следовательно, должны читаться

40 echo "${PRINT}" > ~/ipy.log
41 echo "${WEEKDAY}" > ~/days.log
2
28.04.2021, 23:23

Теги

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