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 sed
comando reemplaza todos los espacios con _
.
¿Cómo puedo editar el sed
comando para que incluya espacios junto con los caracteres especificados? He intentado usar \s
pero no funciona ...
EDITAR:
Por ejemplo: el archivo trip: hill
debe renombrarse: trip_ hill
pero 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
-n
despué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