cambio de nombre perl: anteponer algo a un set de nombres de file en subdirectorys

Aunque la herramienta de rename perl ha convertido en un compañero invaluable para mi trabajo diario, todavía hay algunas peculiaridades que dificultan el trabajo, especialmente cuando los files no están en el directory de trabajo actual.

Supongamos que hay muchas facturas y sabemos que todas desde el cliente1 ya están asignadas a una count. Entonces, para facilitar el procesamiento de scripts más adelante, queremos assi_ para "asignado".

Por ejemplo:

 /home/user/bizz/invoices $ ls -1 t1/inv* t1/inv_customer1_20130506.txt t1/inv_customer1_20130823.txt t1/inv_customer1_20130930.txt t1/inv_customer2_20131207.txt t1/inv_customer2_20131113.txt 

Ahora mira lo que sucederá:

 /home/user/bizz/invoices $ rename 's/^/assi_/' t1/inv_customer1* Can't rename t1/inv_customer1_20130506.txt assi_t1/inv_customer1_20130506.txt: No such file or directory (etc.) 

Heheh. rename ha elegido la ruta completa para assi_ to, en lugar de solo el file. Así que no es de extrañar que no pueda encontrar inv_customer1_20130506.txt en el directory no existente "assi_t1".

Entonces, ¿cómo se puede rename para que se aplique la expresión regular al nombre del file solamente?

Notas:
1. No siempre quiero cd a los subdirectorys.
2. Me abstendría de usar loops, así como find , si es posible.

Solutions Collecting From Web of "cambio de nombre perl: anteponer algo a un set de nombres de file en subdirectorys"

rename funciona de esta manera porque puede mover files entre directorys. Al igual que mv , actúa en todo el path, no solo en el último componente.

Si solo desea modificar el último componente, puede anclar su expresión regular en (\A|?<=/) Y asegurarse de que no coincida con ninguna / solo las coincidencias en el último / .

 rename 's~(\A|?<=/)(?=[^/]*)\z~assi_~' t1/inv_customer1* 

Otro enfoque es dividir primero el nombre del file.

 rename 's~(.*/)~~s; my $d = $1; s/\A/assi_/; $_ = "$d$_"' t1/inv_customer1* 

También puede usar el module File::Spec . Esto tiene la ventaja de hacer frente a routes que no son de Unix.

 rename 'use File::Spec::Functions; my ($v,$d,$f) = splitpath($_); $f =~ s/\A/assi_/; $_ = catpath($v,$d,$f)' t1/inv_customer1*