macos - usuario - sistema operativo mac os x
cambio de nombre de lote de mac os x (7)
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
agradecimiento 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: el echo
se antepone a mv
para realizar una ejecución en seco. Eliminarlo para realizar el cambio de nombre real.
Puede ejecutarlo desde la línea de comando o usarlo en un script.
-
"${f/_*_/_}"
es una aplicación de expansión de parámetrosbash
: el (primer) patrón coincidente de subcadena_*_
se reemplaza por literal_
, cortando efectivamente el token central del nombre. - Tenga en cuenta que
_*_
es un patrón (una expresión comodín, como también se usa para globbing), no una expresión regular (para aprender sobre patrones, ejecutarman bash
y buscarPattern Matching
).
Si encuentra archivos de cambio de nombre por lotes con frecuencia, considere una herramienta especializada como la utilidad de rename
basada en Perl. En macOS puedes instalarlo usando el popular gestor de paquetes Homebrew siguiente manera: brew install rename
Aquí está el comando equivalente usando rename
:
rename -n -e ''s/_.*_/_/'' *.png
De nuevo, este comando realiza una ejecución en seco; eliminar -n
para realizar el cambio de nombre real.
- Similar a la solución
bash
,s/.../.../
realiza la sustitución de texto, pero a diferencia debash
, se utilizan expresiones regulares verdaderas.
Para cambiar el nombre de los archivos, puede usar la utilidad de 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
Puedes usar sed:
ls * | sed -e ''p;s@_.*_@_@g'' | xargs -n2 mv
resultado:
prefix_567.png prefix_efg.png
* para hacer un funcionamiento en seco primero, reemplazar mv
al final con echo
Tenía un lote de archivos que se veía así: be90-01.png y necesitaba cambiar el guión para subrayar. Usé esto, que funcionó bien:
for f in *; do mv "$f" "`echo $f | tr ''-'' ''_''`"; done
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
puedes instalar el comando rename
usando brew
. simplemente brew install rename
y brew install rename
.