Como obter o BASH para usar * curinga no comando?

2

Eu criei um script bash para automatizar a edição dos dados EXIF em arquivos de imagem. Não consigo descobrir como fazer com que o script emita um comando com o * curinga (asterisco) para especificar um padrão de nome de arquivo.

O script monta corretamente um comando da CLI que é executado corretamente se eu inseri-lo manualmente fora do script bash. Mas a partir do bash, o script retorna um erro de arquivo não encontrado.

Aqui está o meu código:

#!/bin/bash

# Usage: Place this script in the directory of jpg files whose EXIF data is to be edited.

echo Press enter to accept default values.

# Enter camera manufacturer.
default="Pentax"
read -p "Enter camera manufacturer [$default]: " cameramake
cameramake=${cameramake:-$default}
exifargs="-model=$cameramake"

# Enter camera model.
default="K1000"
read -p "Enter camera model [$default]: " cameramodel
cameramodel=${cameramodel:-$default}
exifargs="$exifargs -make=$cameramodel"

# Enter slide film type.
default="Kodachrome slide film."
read -p "Enter slide film type [$default]: " filmtype
filmtype=${filmtype:-$default}
exifargs="$exifargs -imagedescription='PIE PS-5000 slide scanner. VueScanner 32 scanning softare. $filmtype'"

# Enter file name pattern.
default="*.jpg"
read -p "Enter file name pattern [$default]: " namepattern
namepattern=${namepattern:-$default}
exifargs="$exifargs $default"

#Use exiftool to edit EXIF data
echo /home/richard/Dropbox/Pictures/Tools/ExifTool/exiftool "$exifargs"
/home/richard/Dropbox/Pictures/Tools/ExifTool/exiftool "$exifargs"

Inseri o comando "echo" para verificar se meu comando está correto. É (em lances para o CLI). Os resultados da execução do script são:

richard@richard-laptop:~/Dropbox/Pictures/Photos/test$ sh exifbatch.sh
Press enter to accept default values.
Enter camera manufacturer [Pentax]: 
Enter camera model [K1000]: 
Enter slide film type [Kodachrome slide film.]: 
Enter file name pattern [*.jpg]: 
/home/richard/Dropbox/Pictures/Tools/ExifTool/exiftool -model=Pentax -make=K1000 -imagedescription='PIE PS-5000 slide scanner. VueScanner 32 scanning softare. Kodachrome slide film.' *.jpg
No file specified

Mas quando eu digito exatamente o mesmo texto criado pelo script na linha de comando, ele funciona como eu quero, localizando os arquivos no diretório atual que correspondem ao padrão de nome. (Os avisos lançados por exiftool são esperados.):

richard@richard-laptop:~/Dropbox/Pictures/Photos/test$ /home/richard/Dropbox/Pictures/Tools/ExifTool/exiftool -model=Pentax -make=K1000 -imagedescription='PIE PS-5000 slide scanner. VueScanner 32 scanning softare. Kodachrome slide film.' *.jpg
Warning: [minor] Ignored empty rdf:Seq list for darktable:mask_id - 1987_California-01.jpg
Warning: [minor] Ignored empty rdf:Seq list for darktable:mask_id - 1987_California-02.jpg
2 image files updated

Como eu mudo meu script basch para que o comando seja executado como na CLI? Eu acho que há algo errado com o uso do caractere *. Se eu não colocar aspas (") ao redor do nome da variável $ exifargs, o bash imediatamente interpreta o * .jpg e anexa todos os nomes dos arquivos na string, o que confunde o comando exiftool.

Obrigado!

    
por trinkner 23.10.2016 / 23:12

1 resposta

2

As citações no shell são complicadas. Se você quiser usar vários parâmetros, especialmente quando alguns deles contiverem espaços em branco, use matrizes. Observe que você precisa de% realbash para executar o script para usar arrays, portanto, não inicie o script com sh , que executa dash , sem suporte a matriz.

args=( -model="$cameramake"
       -make="$cameramodel"
       -imagedescription="PIE PS-5000 slide scanner. VueScanner 32 scanning softare. $filmtype"
       $namepattern )
exiftool "${args[@]}"

BTW, tem certeza de que deseja nomear a variável que contém o modelo "make" e nomear a variável que contém o "modelo" do fabricante? Observe também que "software" tem um w depois de t .

    
por choroba 23.10.2016 / 23:30