Eliminar espacios en blanco y paréntesis en nombres de files con sed

Soy un absoluto novato en el área de Unix, así que discúlpeme si he ido por este path equivocado.

Tengo una serie de files que necesito cambiar el nombre y todos tienen el patrón "(*)" en ellos. P.ej;

001 (1).txt 002 (1).txt 003 (2).txt 

Mi resultado deseado es cambiar el nombre de los files a 001.txt, 002.txt, 003.txt. Tenga en count que los files reales varían en longitud y tipo de extensión (este es mi lote de testing).

He buscado en la networking y en el SE y he obtenido lo siguiente que me da la salida deseada en la terminal.

 ls *\(*\)* | sed 's/\(.*\)\( (.*)\)\(.*\)/mv & \1\3/' mv 001 (1).txt 001.txt mv 002 (1).txt 002.txt mv 003 (2).txt 003.txt 

Sin embargo, una vez que lo pipeteo a sh obtengo el siguiente error.

 sh: line 1: syntax error near unexpected token `(' sh: line 1: `mv 001 (1).txt 001.txt' 

Sé que tiene que ver con la sección \( (.*)\) . Intenté escaping de los paréntesis internos, pero eso no me da el resultado deseado. También busqué forms regex para decir search los espacios en blanco seguidos por 3 caracteres, pero no tuve suerte.

Sé que hay forms más fáciles de lograr lo que quiero, pero fui con sed porque hasta ahora era lo único que podía entender vagamente. Aprecio mucho cualquier aporte para que funcione la línea anterior y luego considere enfoques más fáciles.

Hay un command de cambio de nombre que hace justamente esto, pero nunca lo he usado.

Tu script está cerca. Prueba esto:

 ls -d -- *\(*\)* | sed 's/\(.*\) (.*)\(.*\)/mv -- "&" "\1\2"/' 

Tenga en count que '(' es un carácter especial para el intérprete de commands. Ponerlo entre comillas dobles cancela su significado especial.

Usando Bash

Puede usar este command para hacerlo usando estrictamente solo Bash:

 $ for file in ./*; do mv "$file" "${file/ (*)/}"; done 

Ejemplo

 $ ls -1 001 (1).txt 002 (1).txt 003 (2).txt 

Ejecutando el command de arriba:

 $ for file in ./*; do mv "$file" "${file/ (*)/}"; done $ ls -1 001.txt 002.txt 003.txt 

Usando renombrar

Algunas distribuciones (Debian / Ubuntu) incluyen el command rename . Puede hacer lo que quiera, así que use esta versión de rename de rename .

 $ rename -v 's/ \(.*\)\./\./' ./*.txt 

Ejemplo

 $ rename -v 's/ \(.*\)\./\./' ./*.txt 001 (1).txt renamed as 001.txt 002 (1).txt renamed as 002.txt 003 (2).txt renamed as 003.txt $ ls -1 001.txt 002.txt 003.txt 

Sin embargo, las distribuciones de Red Hat no incluyen esta versión de rename de rename .

Referencias

  • Cambio de nombre de lote
 for i in *'('*')'* do mv "$i" `echo $i | sed 's/\(.*\) (.*).\(.*\)/\1.\2/'` done