Estoy tratando de cambiar el nombre de archivos como este:
for file in *;
do
mv -i "$file" "$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')";
done
Pero el sedcomando reemplaza todos los espacios con _.
¿Cómo puedo editar el sedcomando para que incluya espacios junto con los caracteres especificados? He intentado usar \spero no funciona ...
EDITAR:
Por ejemplo: el archivo trip: hilldebe renombrarse: trip_ hillpero el comando anterior lo hace trip__hill.
command-line
bash
sed
batch-rename
Zanna
fuente
fuente

Respuestas:
No analice los nombres de archivo con
sed! La salida deecho "$file"puede no ser confiable.Uso
rename. En 17.10 necesitas instalarlo primeroLuego:
Notas
-ndespués de probar para cambiar el nombre de los archivos--fin de opciones en caso de que algún archivo comience con-[^-A-Za-z0-9_ .]caracteres que no queremos reemplazar: poner-primero o último para que no pueda indicar un rango (se trata literalmente en estas posiciones)..se trata literalmente (en otros contextos regex significa cualquier carácter y necesita ser escapado).Esto también funciona en
sed:Si agrego un espacio al final en su versión, aparece un error:
Pero con
-al final, funciona:Entonces, tal vez la posición del guión causó su problema cuando agregó el espacio. ¡Pero el consejo de no analizar nombres de archivos es válido!
fuente
.es literal en una clase de caracteres. TIL!También puede usar el shell, la expansión de parámetros de Bash puede hacer sustitución:
La doble barra le dice que reemplace todas las coincidencias, aparte de eso, la sintaxis es sencilla.
fuente