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 mv
comando tentaria mover os dois arquivos R 1 Pe.jpg
para “R1
um 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 rename
comando. (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/ /}"