Insertar carácter al cambiar el nombre de la carpeta por lotes

2

Tengo una carpeta que tiene varios cientos de miles de archivos nombrados como "ABC 123456". Necesito agregar un guión después entre los dos bloques de texto como este "ABC - 123456". Saliendo del espacio final.

Automator no ofrece un método para contar 4 caracteres e insertar un nuevo guión y espacio.

Tengo este comando de terminal y he estado jugando con él.

for file in *.txt
do
  echo mv "$file" **"$file" count 3 "- "**
done

¿Alguien sabe de un Applescript o puede ayudar con el comando de terminal que me ayudará a cambiar el nombre de los archivos?

usuario-44651
fuente

Respuestas:

3

La pregunta en sí misma tampoco es exacta, porque el OP habla de:

  • nombres de archivos como ABC 123456(sin extensión), pero en el código de ejemplo que usa *.txtextensión
  • agregue un guión entre dos bloques (por ejemplo, dónde está el espacio) como ABC - 123456, pero en la próxima toma counting to 4y count 3, por ejemplo, no aclare exactamente qué debe hacer el script, por ejemplo, si encuentra ABCD 12oAB 345
  • Además, quiero mantener el espacio final, lo que es extraño, pero está bien;)

El problema es divisible en 3 partes separadas:

  1. seleccionando los archivos correctos para cambiar el nombre
  2. preparar el nuevo nombre de archivo, reemplazar / agregar caracteres al anterior
  3. el cambio de nombre "físico"

Anuncio "seleccionando los archivos correctos". La selección de los archivos puede ser realizada por algunas utilidades externas, por ejemplo, mediante el findcomando. Los principales beneficios de la findson:

  • también puede buscar archivos de forma recursiva en los subdirectorios
  • es posible seleccionar con mayor precisión los archivos correctos, por ejemplo, excluir directorios, seleccionar archivos por tiempo o tamaño, etc. (consultar desde la terminal man find)

Anuncio "preparar el nuevo nombre". Esto puede hacerse mediante programas externos, como sedo awkcualquier programa que pueda manipular texto en scripts de shell, o puede hacerse (en algunos casos simples como este) dentro de bashsí mismo, y es posible ahorrar una costosa ejecución de comandos. (para cientos de miles de archivos hace la diferencia).

El seguimiento:

${file/ /-}

sustituye (reemplaza) un espacio (la / /parte) con el guión ( /-). Entonces es posible escribir

mv "$file" "${file/ /-}"

y guardar la sedejecución.

Entonces, una de las soluciones alternativas podría ser , por ejemplo, la siguiente:

#!/bin/bash
while IFS= read -r -d $'\0' filename
do
    newfilename="${filename/ /-}"
    [[ "$filename" != "$newfilename" ]] && echo mv -i "$filename" "$newfilename"
done < <(find . -maxdepth 1 -type f -iname "* *.jpg" -print0)

El abobe es para DRY RUN : solo mostrará, lo que se hará, para la ejecución real, elimine el echo.

Descomposición:

  • seleccionando los archivos correctos para el cambio de nombre: el find . -maxdepth 1 -type f -iname "* *.jpg" -print0encontrará todos

    • que solo están en el directorio actual ( -maxdepth 1)
    • y son archivos simples ( -type f)
    • y su nombre coincide (cualquier cosa) (espacio) (cualquier cosa) .jpg mayúsculas y minúsculas - por ejemplo, el nombre debe contener un espacio
    • proporcione los nombres de archivo como nulos terminados , por lo que su nombre también puede contener de forma segura el carácter de nueva línea. ( -print0)
  • el ciclo while IFS= read -r -d $'\0' filename; do ... done < <( )

    • lee el resultado del findcomando anterior
    • donde los nombres de archivo son nulos terminados ( -d $'\0')
    • ignorar los caracteres escapados ( -r) / tema avanzado - no es necesario explicarlo aquí /
    • los IFS= previene de recorte del espacio inicial y final del nombre de archivo (también, un tema avanzado poco)
  • preparar el nuevo nombre de archivo newfilename="${filename/ /-}"

    • se realiza bashinternamente (sin ejecutar un comando externo).
    • si desea preservar el espacio final después del uso del guión ${filename/ /- }
  • el cambio de nombre real se realiza mediante el mvcomando (ver man mvdesde la terminal), donde

    • el -ilo que le preguntará al usuario si ya están aquí un archivo con el nuevo nombre de archivo (no anularlo)
  • y el mvse ejecuta solo cuando el newfilenamees diferente delfilename [[ "$filename" != "$newfilename" ]]

La solución anterior es en su mayoría propensa a errores, pero aún así no es muy efectiva, porque para cientos de miles de archivos ejecutará cientos de miles de veces el mvcomando. La solución puede ser: usar alguna utilidad, lo que puede leer los nombres de archivo y cambiar el nombre sin ejecutar el mvcomando N-times. Por ejemplo, la "gran arma" del sistema administra el "perl", como:

find . -maxdepth 1 -type f -iname "*.jpg" -print0 |\
    perl -0nle '$n=$_; $n=~s/ /-/; rename $_,$n unless($_ eq $n || -e $n)'

lo que cambiará el nombre de todos los archivos lo que generará finden una ejecución, por ejemplo, mucho más rápido que miles de mvejecuciones.

Las pruebas Tor (DRY RUN) usan lo siguiente:

find . -maxdepth 1 -type f -iname "*.jpg" -print0 |\
    perl -0nle '$n=$_; $n=~s/ /-/; print qq{old:$_ new:$n\n} unless($_ eq $n || -e $n)' #print instead of the rename

Ps: el perl es lo suficientemente poderoso como para manejar todo por sí mismo, por ejemplo. el comando find también, pero es un tema más avanzado ...

Ps2: mi inglés es mucho peor que el mío bash, por lo que alguien podría editar esta publicación para agregar / corregir cosas ...;)

jm666
fuente
2

Si sus nombres de archivo son "ABC 123456" con un solo espacio entre los primeros 3 y los siguientes, entonces está tratando de reemplazar el espacio con un carácter (o guión o algo), para que se vea como ABC-123456.

Encontré este artículo que explica cómo hacerlo.

Ejemplo:

Tenga en cuenta que el siguiente comando solo reemplazará espacios con guiones. Si necesita una sustitución diferente, deberá modificar el comando en consecuencia

for i in *.JPG; do mv "$i" "`echo $i | sed -e 's, ,-,g'`"; done

Otros:

Si desea subrayados o cualquier otro carácter en lugar de un guión, simplemente cambie la s, ,-,gparte del comando anterior a s, ,_,g.

Para saber cómo ver este artículo .

Aquí hay una prueba en mi MBA 10.9.5 (utilicé un archivo ABC 123456.png) y lo coloqué en una nueva carpeta. Luego hice el cd a ese directorio en Terminal y ejecuté

for i in *.png; do mv "$i" "`echo $i | sed -e 's, ,-,g'`"; done

El resultado es que funciona muy bien (cambia el nombre del archivo)

Cómo funciona: reemplazaría el espacio en el nombre del archivo en todos los archivos * .png en esa carpeta, así que asegúrese de tenerlo primero en la carpeta correcta.

renombrado

Ruskes
fuente