Echoando o número total de páginas no script Bash

0

Eu tenho o seguinte script para o processamento em lote pdf-ocr & funciona bem

#!/bin/sh
# apt-get install exactimage tesseract-ocr ghostscript
# bash tut: http://linuxconfig.org/bash-scripting-tutorial
# Linux PDF,OCR: http://blog.konradvoelkel.de/2013/03/scan-to-pdfa/

y="'pwd'/$1"
echo Will create a searchable PDF for $y

x='basename "$y"'
name=${x%.*}

mkdir "$name"
cd "$name"

# splitting to individual pages
gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -r300 -dTextAlphaBits=4 -o out_%04d.jpg -f "$y"

# process each page
for f in $( ls *.jpg ); do
  # extract text
  tesseract -l eng -psm 3 $f ${f%.*} hocr
 # echo Page ?? of ?? done! 

  # remove the “<?xml” line, it disturbed hocr2df
  grep -v "<?xml" ${f%.*}.html > ${f%.*}.noxml
  rm ${f%.*}.html

  # create a searchable page
  hocr2pdf -i $f -s -o ${f%.*}.pdf < ${f%.*}.noxml
  rm ${f%.*}.noxml
  rm $f
done

# combine all pages back to a single file
# from http://www.ehow.com/how_6874571_merge-pdf-files-ghostscript.html
gs -dCompatibilityLevel=1.4 -dNOPAUSE -dQUIET -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=../${name}_searchable.pdf *.pdf

cd ..
rm -rf $name

Eu só quero saber qual página está sendo concluída do total de páginas do arquivo PDF de entrada?

    
por nightcrawler 07.08.2014 / 21:54

1 resposta

2

Como você já está processando as páginas uma a uma, isso pode ser feito usando a avaliação aritmética bash .

Substitua a parte que lê atualmente

# process each page
for f in $( ls *.jpg ); do
  # extract text

com o seguinte:

CURRENT_PAGE=0
# process each page
for f in *.jpg ; do
  CURRENT_PAGE=$(( $CURRENT_PAGE + 1 ))
  echo Processing page $CURRENT_PAGE ...
  # extract text

O $(( ... )) significa avaliação aritmética. Veja man bash para mais detalhes; procure por ARITHMETIC EVALUATION .

Começamos na página 0 e adicionamos imediatamente 1 a isso antes de processarmos o primeiro arquivo, depois imprimimos o número da página atual.

Se nenhum dos comandos chamados imprimir qualquer saída, você poderá obter uma saída mais limpa substituindo a linha echo por:

  printf "Processing page %d ...\r" $CURRENT_PAGE

O \r significa "retornar ao início da linha" (tecnicamente ele é tratado como um caractere de retorno de linha), portanto a saída do próximo comando sobrescreverá o que você acabou de imprimir. Para vê-lo depois que o script terminar, adicione direto no final:

printf "\n"

para passar para a próxima linha.

E, como terdon apontado em um comentário , você realmente deveria usar

for f in *.jpg

em vez de for f in $( ls *.jpg ) , mas esse é um problema diferente. (Eu incorporei isso ao acima). Eu também sugiro adicionar citações em torno da expansão da variável em todos os lugares que você está se referindo a $f de alguma forma, pela mesma razão.

    
por 07.08.2014 / 22:11