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 medio para que el resultado sea:
prefix_567.png
prefix_efg.png
Relevante pero no completamente explicativo:

_*_con un espacio en blanco.Respuestas:
En su caso específico, puede usar el siguiente
bashcomando (bashes el shell predeterminado en macOS):Nota: Si existe la posibilidad de que sus nombres de archivo comiencen con
-, coloque--antes de ellos [1]:mv -- "$f" "${f/_*_/_}"Nota:
echose antepone amvpara realizar un ensayo. Elimínelo para realizar un cambio de nombre real.Puede ejecutarlo desde la línea de comandos o usarlo en un script.
"${f/_*_/_}"es una aplicación debashexpansión de parámetros : el (primer) patrón de coincidencia de subcadenas_*_se reemplaza con literal_, cortando efectivamente el token del medio del nombre._*_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 bashy buscarPattern Matching).Si tiene que cambiar el nombre de los archivos por lotes con frecuencia, considere instalar una herramienta especializada como la
renameutilidad basada en Perl . En macOS, puede instalarlo utilizando el popular administrador de paquetes Homebrew de la siguiente manera:Aquí está el equivalente del comando en la parte superior usando
rename:Nuevamente, este comando realiza una ejecución en seco; eliminar
-npara realizar el cambio de nombre real.bashsolución,s/.../.../realiza la sustitución de texto, pero, a diferencia de lo quebashocurre con las expresiones regulares verdaderas, se utilizan.[1] El propósito de argumento especial
--, que está soportado por la mayoría de los servicios públicos, es de señalar que los argumentos posteriores deben ser tratados como los operandos (valores), incluso si se ven como opciones debido a que empiecen con-, como Jacob C. notas.fuente
.*->$1), por ejemplo, cambiar el nombreFoo bar S01E01 biz baz.extaS01E01.ext:rename -n -e 's/.*(S[0-9]{2}E[0-9]{2}).*(\.[a-z]{2,4})/$1$2/' *echopara carreras en seco. ¡Gracias por el consejo!brew install renamePara cambiar el nombre de los archivos, puede utilizar la
renameutilidad:brew install renamePor ejemplo, para cambiar una cadena de búsqueda en todos los nombres de archivo en el directorio actual:
Elimine el parámetro 'n' para aplicar los cambios.
Más información:
man renamefuente
OS Xlas versiones deGNU bash( x86_64-apple-darwin ) no incluyen la utilidad de cambio de nombre.brew install renamerename -vs GLYCOPHORIN GLYCC *y ahora es cambiar el nombre de archivos de forma automática 450+. Y super rápido también.Podrías usar sed:
resultado:
* para hacer un ensayo primero, reemplace
mval final conechoExplicación:
fuente
ls * | xargs -I % bash -c 'echo mv "%" "$(sed 's@_.*_@_@' <<<"%")"'(eliminarechopara cambiar el nombre).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:
fuente
puede instalar el
renamecomando usandobrew. solo hazlobrew install renamey úsalo.fuente
Utilizando
mmvfuente
sudo apt-get install mmv.brew install mmv.prueba esto
Aquí hay otra forma:
fuente