O script Bash fornece avisos / erros embora funcione conforme o esperado. Como posso editar para remover avisos / erros?

1

Eu uso o seguinte script para combinar seqüências de imagens localizadas dentro de subdiretórios em arquivos .pdf. Funciona bem, mas imprime erros durante a operação. Estou interessado em refinar o script para remover os erros.

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

Exemplo de erros abaixo ..

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.  

E assim por diante para todos os diretórios que contêm imagens.

    
por Ben Robins 27.06.2017 / 16:45

2 respostas

1

O problema é que, se você encontrar um diretório sem arquivos de imagem correspondentes, o glob é passado não expandido para o comando convert, portanto, você acaba tentando converter arquivos com o nome literal ./*jpg , ./*png e assim por diante. / p>

A solução usual para isso (no bash e em outros shells que o suportam) é permitir globbing nulo . Infelizmente, neste caso, isso cria um erro diferente, já que agora você está chamando convert sem nenhum arquivo de entrada.

Não consigo pensar em uma maneira mais elegante de lidar com isso, exceto definir nullglob , expandir os globs em uma matriz e, em seguida, testar explicitamente se a matriz está vazia ou não. Então, por exemplo:

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

ou mais compactamente

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

ou, assumindo a liderança do @Zanna e eliminando 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
    
por steeldriver 27.06.2017 / 17:46
0

Os erros são causados pela ausência de arquivos correspondentes. Mas não analise a saída de find - use globstar e um teste.

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
    
por Zanna 27.06.2017 / 17:13