¿Cómo eliminar prefijos y sufijos de los nombres de file en un directory determinado?

Tengo muchos files con el mismo prefijo y el mismo sufijo. Quiero eliminar ambos de los nombres de file. Ambos contienen espacios.

Así que foo bar XXX doo par.jpg , foo bar YY YY doo par.jpg se convertiría en XXX.jpg y YY YY.jpg

Con pre nombre:

Preparar:

 $ mkdir test && cd test $ > "foo bar XXX doo par.jpg"; > "foo bar YY YY doo par.jpg" 

Acción:

 $ rename -n 's/^foo bar //; s/ doo par(\.[^.]*)$/$1/' * foo bar XXX doo par.jpg renamed as XXX.jpg foo bar YY YY doo par.jpg renamed as YY YY.jpg 

(Elimine la -n para que realmente se realicen esos movimientos)

Si el nombre del file está en una variable, la forma canónica de eliminar un prefijo es:

 removepre="foo bar " filename="foo bar XXX doo par.jpg" filename="${filename#"$removepre"}" echo "$filename" 

El problema con el sufijo que presenta es que hay una extensión que desea conservar, por lo que se vuelve un poco más larga:

 removesuf=" doo par" filename="foo bar XXX doo par.jpg" extension="${filename##*.}" ### store extension in a variable. filename="${filename%.*}" ### remove extension. filename="${filename%"$removesuf"}" ### remove suffix. filename="$filename.$extension" ### re-place the extension echo "$filename" 

Todos se unieron en un guion:

 #!/bin/bash filename="$1" removepre="foo bar " filename="${filename#"$removepre"}" removesuf=" doo par" extension="${filename##*.}" ### store extension in a variable. filename="${filename%.*}" ### remove extension. filename="${filename%"$removesuf"}" ### remove suffix. filename="$filename.$extension" ### re-place the extension echo "$filename" 

Llamar al script así:

 $ ./script "foo bar XXX doo par.jpg" XXX.jpg" 

Comprenda que las comillas son obligatorias para procesar nombres de file con espacios.