1 votos

Todos los archivos en el directorio nombre de archivo script de eliminación de caracteres error.

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

2voto

TasseDeThe Puntos 8

$file contiene la ruta absoluta, no el nombre de archivo de tus archivos.

En tu ejemplo, $file sería /Users/bob/Downloads/videos/my (awesome) kickass! video.mp4. Dado que / no es parte del conjunto de caracteres 'legales', será removido por sed lo que conduce al comando de movimiento:

mv "/Users/bob/Downloads/videos/my (awesome) kickass! video.mp4" "UsersbobDownloadsvideosmy awesome kickass video.mp4"

Cuando estás ejecutando el comando en la terminal, tu directorio actual probablemente sea el directorio de usuario, lo que significa que el archivo en la ruta absoluta se mueve al directorio actual y cambia de nombre al que ves.

Posibles soluciones

  • solución temporal: agregar '/' al conjunto de caracteres 'legales', para que sed no lo reemplace
  • otra opción, tal vez más limpia: cambiar la expresión regular en sed para eliminar solo los caracteres dados al final de la ruta. Debería ser posible mediante el uso de grupos y teniendo el primer grupo de regex coincidir con la ruta del directorio y el último grupo con el nombre de archivo sin caracteres no deseados (que son los últimos caracteres sin '/')
  • otra opción más: antes de tu bucle, hacer cd al directorio con los archivos y luego iterar sobre *.mp4 en lugar de la ruta absoluta. Esto debería dar nombres de archivo en $file haciendo que el resto del script funcione como se espera.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X