it-swarm-es.com

mac os x terminal lote renombrar

tengo una carpeta con una serie de archivos llamados:

prefix_1234_567.png
prefix_abcd_efg.png

me gustaría eliminar por lotes un guión bajo y el contenido del medio para que la salida sea

prefix_567.png
prefix_efg.png

gracias relevante pero no completamente explicativo: ¿Cómo puedo cambiar el nombre de los archivos usando el Terminal?Regex para cambiar el nombre de los archivos en el terminal OS X

93
kidnim

En su caso específico, puede usar el siguiente comando bash (bash es el Shell predeterminado en macOS):

for f in *.png; do echo mv "$f" "${f/_*_/_}"; done

Nota: si existe la posibilidad de que sus nombres de archivo comiencen con -, coloque -- delante de ellos [1]:
mv -- "$f" "${f/_*_/_}"

Nota: echo se adjunta a mv para realizar un recorrido en seco. Eliminar para realizar el cambio de nombre real.

Puede ejecutarlo desde la línea de comandos o usarlo en un script.

  • "${f/_*_/_}" es una aplicación de bashparámetro de expansión : el (primer) patrón de coincidencia de subcadenas _*_ se reemplaza con el literal _, cortando efectivamente el token del medio del nombre.
  • Tenga en cuenta que _*_ es un patrón (una expresión de comodín, como también se utiliza para el globbing), no un expresión regular (para obtener información sobre los patrones, ejecute man bash y busque Pattern Matching).

Si encuentra que cambia el nombre de los archivos con frecuencia, considere la instalación de una herramienta especializada como la utilidad rename basada en Perl . En macOS, puede instalarlo usando el popular gestor de paquetes Homebrew de la siguiente manera:

brew install rename

Aquí está el equivalente del comando en la parte superior usando rename:

rename -n -e 's/_.*_/_/'  *.png

Una vez más, este comando realiza una ejecución en seco; elimine -n para realizar el cambio de nombre real.

  • Similar a la solución bash, s/.../.../ realiza la sustitución de texto, pero, a diferencia de bash, true expresiones regulares se usa.

[1] El propósito del argumento especial --, que es compatible con la mayoría de las utilidades, es señalar que los argumentos subsiguientes deben tratarse como operandos (valores), incluso si mirar como opciones debido a que comienza con -, como notas de Jacob C. .

195
mklement0

Para cambiar el nombre de los archivos, puede usar la utilidad rename:

brew install rename

Por ejemplo, para cambiar una cadena de búsqueda en todos los nombres de archivo en el directorio actual:

rename -nvs searchword replaceword *

Elimine el parámetro 'n' para aplicar los cambios.

Más información: man rename

86
David Thomas

Podrías usar sed:

ls * | sed -e 'p;[email protected]_.*[email protected][email protected]' | xargs -n2 mv

resultado:

prefix_567.png prefix_efg.png

* para hacer un recorrido en seco primero, reemplaza mv al final con echo

Explicación:

  • e: opcional para solo 1 comando de sed.
  • p: para imprimir la entrada a sed, en este caso será el nombre del archivo original antes de cualquier cambio de nombre
  • @: es un reemplazo de/character para hacer más legible. Es decir, en lugar de usar sed s/search/replace/g, use s @ search @ replace @ g
  • _. *: el guión bajo es un carácter de escape para referirse al '.' real. carácter cero o más veces (a diferencia de CUALQUIER carácter en expresiones regulares)
  • -n2: indica que hay 2 salidas que deben pasarse a mv como parámetros. para cada entrada de ls , este comando sed generará 2 salidas, que luego se suministrarán a mv.
12
l'L'l

Tuve un lote de archivos con el siguiente aspecto: be90-01.png y necesitaba cambiar el guión para subrayar. Utilicé esto, que funcionó bien:

for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done
7
JanB

puede instalar el comando rename usando brew. solo haga brew install rename y úselo.

2
Nisim Joseph

Usando mmv

mmv '*_*_*' '#1_#3' *.png
1
αғsнιη

prueba esto

for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done

Aquí hay otra manera:

for file in Name*.png; do mv "$file" "01_$file"; done
1
Joolah