Instalando

Instalando

Iniciante total aqui, tentando escrever algum código para remover o primeiro espaço de um lote de nomes de arquivos.

Quando digito no terminal:

#!/bin/bash

for f in *.jpg; do echo mv "$f" “${f/ /}”; done

Eu recebo:

mv R 1  Pe.jpg “R1 Pe.jpg”
mv R 10 Ma.jpg “R10 Ma.jpg”
mv R 11 An.jpg “R11 An.jpg”

Mas quando removo o echo, a renomeação real não acontece, recebo este erro:

for f in *.jpg; do mv "$f" “${f/ /}”; done
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

Alguma sugestão?

Responder1

Essas não são citações. Você não tem ":

$ uniprops “
U+201C ‹“› \N{LEFT DOUBLE QUOTATION MARK}
    \pP \p{Pi}
    All Any Assigned Punct Is_Punctuation Common Zyyy Pi P General_Punctuation
       InPunctuation Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase
       Initial_Punctuation Pat_Syn Pattern_Syntax PatSyn Print X_POSIX_Print
       Punctuation QMark Quotation_Mark Unicode X_POSIX_Punct


$ uniprops '"'
U+0022 ‹"› \N{QUOTATION MARK}
    \pP \p{Po}
    All Any ASCII Assigned Basic_Latin Punct Is_Punctuation Common Zyyy Po P
       Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Other_Punctuation
       Pat_Syn Pattern_Syntax PatSyn POSIX_Graph POSIX_Print POSIX_Punct Print
       X_POSIX_Print Punctuation QMark Quotation_Mark Unicode X_POSIX_Punct

Como as aspas nos nomes de destino não são aspas duplas adequadas, o segundo argumento seria dividido em espaços e o primeiro mvcomando tentaria mover os dois arquivos R 1 Pe.jpgpara “R1um diretório não existente Pe.jpg”. Isto é o que causa os erros.

Então tente isto:

for f in *.jpg; do echo mv "$f" "${f/ /}"; done

Responder2

Sim, é um problema de cotação (veja outras respostas).

Porém, para este problema específico, é melhor fazê-lo com o renamecomando. (Aquele de Larry Wall)

por exemplo

rename -n -e "s/ //" *.jpg

Após testar e verificar a saída. Remova o -n.

Instalando

No Debian com apt install rename.

Responder3

Sim, as cotações são um problema. O eco mostra o comando como:
mv R 1 Pe.jpg “R1 Pe.jpg”
Se você digitasse isso na linha de comando, ele falharia, porque os espaços na fonte não estão entre aspas nem escapados. O comando correto seria:
mv "R 1 Pe.jpg" "R1 Pe.jpg"
Para colocar quits em torno da variável $f, eu sugeriria algo assim:
mv "\""$f"\"" "${f/ /}"
onde "\"" é o código de escape para imprimir aspas duplas.
A saber: echo " n " displays n. echo " \n " escapa do n e mostra uma nova linha. Da mesma forma, escapa echo " \" "uma aspa entre aspas.

mv '"'$f'"' "${f/ /}"

informação relacionada