Eliminar ciertos caracteres de múltiples archivos con espacios en blanco

8

Estoy tratando de cambiar el nombre de un montón de pistas de música en un directorio, pero recibí este error:

Al mover varios archivos, el último argumento debe ser un directorio

Este es el guión:

for file in * ; do
    mv $file  $(echo $file |sed 's/^.\{5\}//g')
done

Esto funciona para un archivo sin espacios en blanco, ¿cómo modificaría este script?

Casper
fuente

Respuestas:

14

Use comillas:

mv -- "$file" "$(echo "$file" | sed ...)"

Else mvve múltiples argumentos. Un nombre de archivo llamado file name with spacessería 4 argumentos para mv. Por lo tanto el error: when moving multiple files, last argument must be a directory. Cuando mvtiene más de 2 argumentos, se supone que desea mover varios archivos a un directorio (que luego sería el último argumento).


Sin embargo, parece que desea eliminar los primeros 5 caracteres del nombre de archivo. Eso se puede hacer más simple con bash:

mv -- "$file" "${file:5}"

Editar : agregué la --bandera, gracias al comentario de @ pabouk . Ahora los archivos que comienzan con guión -también se procesan correctamente.

caos
fuente
2
Eso puede no funcionar con los nombres de archivo que comienzan por -. En lugar de echo "$file"usar printf '%s\n' "$file".
pabouk
Me había olvidado de mv. :) Manejaste ese caso :) --- Lo que quise decir fue un problema en echosí mismo. Por ejemplo GNU eco (tanto independiente y bash incorporado) no se imprimirá estas cadenas: -n, -ey -E. Incluso de acuerdo con la definición POSIX, no es posible usarlo de echomanera confiable porque ciertas situaciones no están definidas. Compatible con XSI echointerpretará secuencias de escape de barra invertida. --- printf '%s\n'no tiene tales efectos no deseados y dependientes de la implementación.
pabouk
3

Puede usar prename, que a menudo se distribuye junto con Perl. (Por ejemplo, en Debian, / usr / bin / prename está instalado por el perlpaquete). Si no está empaquetado por su distribución (busque prenamey renameen las ubicaciones de binarios convencionales), está disponible para descargar desde varios lugares, como por ejemplo aquí , aquí o aquí .

Este script toma una expresión regular para aplicar a cada uno de los nombres de archivo, y un conjunto de nombres de archivo, y modifica los nombres de esos archivos de acuerdo con esa expresión regular.

Por ejemplo, podrías hacer

prename -v -n 's/^.{5}//' *

para mostrar lo que sucedería si elimina los primeros cinco caracteres en los nombres de archivo. Para ejecutar realmente el cambio de nombre, simplemente elimine el -n.

un CVn
fuente