/ / perl -pe para manipular nombres de archivo - perl, shell

perl -pe para manipular nombres de archivo - perl, shell

Estaba tratando de hacer una limpieza rápida de nombre de archivo en el shell (zsh, si es importante). Renombrar archivos. (Estoy usando cp en lugar de mv Solo para estar seguros)

foreach f (#*.ogg)
cp $f `echo $f | perl -pe "s/#d+ (.+)$/"1"/"`
end

Ahora, sé que hay herramientas para hacer cosas como esta, pero por interés personal, me pregunto cómo puedo hacerlo de esta manera. En este momento, recibo un error:

cp: target `When.ogg"" is not a directory

Donde "When.ogg" es la última parte del nombre de archivo. He intentado agregar comillas (ver arriba) y escapar de los espacios, pero no obstante esto es lo que obtengo.

¿Hay alguna razón por la que no puedo usar la salida de s perl pmr =; omrt como argumento final para otra herramienta de línea de comandos?

Respuestas

0 para la respuesta № 1

Esto es lo que necesitas en bash, espero que también sea bueno para zsh.

cp "$f" "`echo $f | perl -pe "s/#d+ (.+)$/1/"`"

Si el nombre del archivo contiene espacios, también debe citar el segundo argumento de cp.


1 para la respuesta № 2

Parece que tiene un espacio en los nombres de archivo que se procesan, por lo que cada una de sus líneas de comando cp se evalúa como algo así

cp #nnnn When.Ogg When.ogg

Cuando el comando cp ve más de dos argumentos, el último debe ser un nombre de directorio de destino para todos los archivos a copiar, de ahí el mensaje de error. Porque su nombre de archivo fuente ($f) contiene un espacio que se trata como dos argumentos: cp ve Tres args, en lugar de los dos que pretendes.

Si pones comillas dobles alrededor del primero $ f que debería evitar que las dos "mitades" del nombre sean tratadas como nombres de archivo separados:

cp "$f" `echo ...

0 para la respuesta № 3

A menudo uso

dir /b ... | perl -nle"$o=$_; s/.../.../; $n=$_; rename $o,$n if !-e $n"

los -l muerde la entrada.

los -e la comprobación es para evitar renombrar accidentalmente todos los archivos a un nombre. Lo he hecho un par de veces.

En bash (y supongo que zsh), eso sería

foreach f (...)
echo "$f" | perl -nle"$o=$_; s/.../.../; $n=$_; rename $o,$n if !-e $n"
end

o

find -name "..."  -maxdepth 1 
| perl -nle"$o=$_; s/.../.../; $n=$_; rename $o,$n if !-e $n"

o

find -name "..."  -maxdepth 1 -exec 
perl -e"for (@ARGV) {
$o=$_; s/.../.../; $n=$_;
rename $o,$n if !-e $n;
}" {} +

El último admite nombres de archivo con nuevas líneas en ellos.