Instalación

Instalación

Principiante total aquí, intentando escribir algún código para eliminar el primer espacio de un lote de nombres de archivos.

Cuando escribo en la terminal:

#!/bin/bash

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

Yo obtengo:

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

Pero cuando elimino el eco, el cambio de nombre real no ocurre, aparece este error:

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

¿Alguna sugerencia?

Respuesta1

Esas no son comillas. Usted no tiene ":

$ 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

Dado que las comillas en los nombres de destino no son comillas dobles adecuadas, el segundo argumento se dividiría en espacios y el primer mvcomando intentaría mover los dos archivos R 1 Pe.jpga “R1un directorio no existente Pe.jpg”. Esto es lo que causa los errores.

Entonces prueba esto:

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

Respuesta2

Sí, es un problema de citas (ver otras respuestas).

Sin embargo, para este problema específico, es mejor hacerlo con el renamecomando. (El de Larry Wall)

p.ej

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

Después de probar y comprobar el resultado. Eliminar el -n.

Instalación

En Debian con apt install rename.

Respuesta3

Sí, las citas son un problema. El eco muestra el comando como:
mv R 1 Pe.jpg “R1 Pe.jpg”
Si escribiera esto en la línea de comando, fallaría, porque los espacios en el código fuente no están entre comillas ni escapes. El comando correcto sería:
mv "R 1 Pe.jpg" "R1 Pe.jpg"
Para poner valores alrededor de la variable $f, sugeriría algo como esto:
mv "\""$f"\"" "${f/ /}"
donde "\"" es el código de escape para imprimir una comilla doble.
A saber: echo " n " muestra n. echo " \n " escapa del n y muestra una nueva línea. De manera similar, echo " \" "escapa una cita entre comillas.
Otra opción podría ser:
mv '"'$f'"' "${f/ /}"

información relacionada