Estoy intentando usar esta pregunta para renombrar todos los archivos en un directorio y mantener solo [a-zA-Z0-9. ] (el último carácter es un espacio).
La entrada de terminal que estoy usando es:
for file in /Users/bob/Downloads/videos/*.mp4; do mv "$file" "$(sed 's/[^0-9A-Za-z. ]//g' <<< "$file")"; done
¿Qué se está haciendo?
Mi entendimiento actual, comando por comando, es:
[1] for file in /Users/bob/Downloads/videos/*.mp4
Crea una variable de cadena llamada file
que contiene el texto donde está *
, entonces si un archivo se llamara my (awesome) kickass! video.mp4
la variable file
sería una cadena que contiene my (awesome) kickass! video.mp4
[2] do
Por cada archivo que coincida con el patrón (un archivo con extensión mp4) hacer los siguientes comandos
[3] mv
"$file" "$(sed)"
Usar el comando mover archivo para renombrar el archivo que coincide
[4] "$(sed 's/[^0-9A-Za-z. ]//g'
Usar el comando de editor de flujo para realizar un reemplazo de regex.
Encontrar cada caracter que no está en la lista y reemplazarlo con lo que está entre las dos barras inclinadas hacia adelante (nada); es decir, remover caracteres que no coinciden.
[5] <<< "$file")"; done
No tengo ni idea de qué hace el operador <<<
, o qué significa referenciar de vuelta a la variable file
.
Resultado Esperado
Un archivo llamado my (awesome) kickass! video.mp4
es renombrado a my awesome kickass video.mp4
y se queda en el mismo directorio
Resultado Real
El archivo my (awesome) kickass! video.mp4
es renombrado a UsersbobDownloadsvideosmy awesome kickass video.mp4
y es movido al directorio Users