Opções de comando no script bash misturadas para nomes de arquivos

0

Desenvolvi este script simples:

#!/bin/bash


for img in 'find ./to_upload -iname "*.jpg" -type f'
do
    mogrify ‑resize 1024 ‑sample 70 ${img}
done

Quando eu executo, o script retorna:

...
mogrify: unable to open image '‑resize': No such file or directory @ error/blob.c/OpenBlob/2658.
mogrify: no decode delegate for this image format '' @ error/constitute.c/ReadImage/501.
mogrify: unable to open image '1024': No such file or directory @ error/blob.c/OpenBlob/2658.
mogrify: no decode delegate for this image format '' @ error/constitute.c/ReadImage/501.
mogrify: unable to open image '‑sample': No such file or directory @ error/blob.c/OpenBlob/2658.
mogrify: no decode delegate for this image format '' @ error/constitute.c/ReadImage/501.
mogrify: unable to open image '70': No such file or directory @ error/blob.c/OpenBlob/2658.
mogrify: no decode delegate for this image format '' @ error/constitute.c/ReadImage/501.
...

para cada arquivo. O que está errado? Eu estou usando o teste do Debian.

Não é o script:

$ mogrify ‑resize 1024 ‑sample 70 image.jpg
mogrify: unable to open image '‑resize': No such file or directory @ error/blob.c/OpenBlob/2658.
mogrify: no decode delegate for this image format '' @ error/constitute.c/ReadImage/501.
mogrify: unable to open image '1024': No such file or directory @ error/blob.c/OpenBlob/2658.
mogrify: no decode delegate for this image format '' @ error/constitute.c/ReadImage/501.
mogrify: unable to open image '‑sample': No such file or directory @ error/blob.c/OpenBlob/2658.
mogrify: no decode delegate for this image format '' @ error/constitute.c/ReadImage/501.
mogrify: unable to open image '70': No such file or directory @ error/blob.c/OpenBlob/2658.
mogrify: no decode delegate for this image format '' @ error/constitute.c/ReadImage/501.

Estou usando o terminal do gnome. Eu não entendo, talvez seja um bug debian?

mogrify -resize 1024 -sample 70 image.jpg

mogrify ‑resize 1024 ‑sample 70 image.jpg

Eu resolvi mas não entendo porque, a primeira linha funciona mas a segunda linha não funciona. Por favor, alguém pode tentar (copiar e colar na linha de comando)?

    
por Appost 06.10.2014 / 18:14

3 respostas

1

Eu suspeito que o problema é que você copiou e colou o comando no Microsoft Word (ou algum processador de texto semelhante) e, em seguida, copiou e colou de volta para o terminal. Na sua

mogrify ‑resize 1024 …

comando, o caractere antes de resize é um caractere Unicode U + 2011, que é um hífen sem quebra (consulte o gráfico Unicode ). Tente redigitá-lo como um traço simples (sinal de menos.).

    
por 07.10.2014 / 01:49
0

Eu suponho que você tenha nomes de arquivos com espaços. Use um loop for para iterar palavras e um while read para iterar linhas

find ./to_upload -iname "*.jpg" -type f -print0 |
while IFS= read -r -d "" img; do
    mogrify ‑resize 1024 ‑sample 70 "$img"
done

Além disso, é crucial usar aspas duplas em torno do nome da variável.

    
por 06.10.2014 / 18:17
0
find ./to_upload -iname "*.jpg" -type f -exec mogrify ‑resize 1024 ‑sample 70 {} \;

Observe o estranho \; no fim - ';' faz parte da sintaxe da opção -exec do find, por isso deve ser prefixado com um '\' para evitar ser interpretado pelo shell. Diz ao find para invocar o subcomando exatamente uma vez para cada arquivo encontrado.

Você também pode fazer isso, se mogrify aceitar vários arquivos por chamada (o find também garante que ele não exceda o número máximo de argumentos permitidos pelo shell):

find ./to_upload -iname "*.jpg" -type f -exec mogrify ‑resize 1024 ‑sample 70 {} +

P.S. Eu só notei o seu comentário "não é o script" - Eu tenho o ImageMagick no cygwin e ele funciona bem usando os formulários que você mostrou. Tente usar traços duplos, talvez?

P.S.S. Ahah eu encontrei o problema! Copiei suas duas linhas e verifiquei os códigos ascii e descobri que o caractere '-' (traço, hífen) na segunda linha não é o caractere ascii padrão, é um caractere unicode, provavelmente porque o script foi copiado de um processador de texto que freqüentemente traduz hífens ou citações em caracteres especiais que parecem mais bonitos, mas não funcionam em nenhuma linguagem de programação (que eu saiba)

P.S.S.S. Então eu descobri que o G-Man já percebeu isso, dó!

    
por 06.10.2014 / 18:37