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
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 bash
pará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._*_
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.
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. .
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
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:
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
puede instalar el comando rename
usando brew
. solo haga brew install rename
y úselo.
Usando mmv
mmv '*_*_*' '#1_#3' *.png
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