/ / Depuración de Perl one-liner para renombrar archivos - perl

Depuración Perl one-liner para renombrar archivos - perl

Estaba probando este perl de una sola línea, y estoy tratando de averiguar qué pasó con los archivos. Ya no veo los archivos. ¿Los borré o lo que salió mal?

Ejemplo de nombres de archivo listados (original):

IMG_0178.JPG
IMG_0182.JPG
IMG_0183.JPG
IMG_0184.JPG
IMG_0186.JPG

Quería simplemente cambiar la extensión del archivo a minúsculas (.jpg):

perl -e"while(<*.JPG>) { s/JPG$/jpg/; rename <*.jpg>, $_ }"

Respuestas

9 para la respuesta № 1

No lo usas rename con una glob. Usa los escalares. Intente asignar el nombre del archivo a una nueva variable antes de la sustitución y cambie el nombre del antiguo al modificado, así:

perl -e"while(<*.JPG>) { ($new = $_) =~ s/JPG$/jpg/; rename $_, $new }"

Compruebe la salida con ls -1:

IMG_0178.jpg
IMG_0182.jpg
IMG_0183.jpg
IMG_0184.jpg
IMG_0186.jpg

4 para la respuesta № 2

Extrañamente tu código debería hacer lo que quisieras.

Un archivo glob como <*.JPG> en contexto escalar devolverá el siguiente archivo que coincida con el patrón, y ya que ambos while y rename Aplica el contexto escalar, los dos globos devuelven el mismo valor en cada iteración.

while (<*.JPG>) {
s/JPG$/jpg/;
rename <*.jpg>, $_;
}

En la primera iteración del bucle. $_ se establece en IMG_0178.JPG por el while, y la sustitución establece el tipo de archivo en minúsculas.

Luego en el cambio de nombre <*.jpg> Se ejecuta en contexto escalar y vuelve de nuevo. IMG_0178.JPG - el primer archivo en la misma lista porque los nombres de los archivos de Windows no distinguen entre mayúsculas y minúsculas.

Así que finalmente se realiza el cambio de nombre rename "IMG_0178.JPG", "IMG_0178.jpg" según sea necesario.

Reescritura rename como esto muestra esto claramente

sub ren($$) {
print "$_[0] -> $_[1]n";
}

while (my $file = <*.JPG>) {
$file =~ s/JPG$/jpg/;
ren <*.JPG>, $file;
}

salida

IMG_0178.JPG -> IMG_0178.jpg
IMG_0182.JPG -> IMG_0182.jpg
IMG_0183.JPG -> IMG_0183.jpg
IMG_0184.JPG -> IMG_0184.jpg
IMG_0186.JPG -> IMG_0186.jpg

Así que tienes suerte, y tus archivos deberían haber sido renombrados como querías.

Pero no lo hagas hacer esto. En particular, debe ejecutar el programa con una declaración de impresión en lugar de cualquier operación crítica para que pueda ver lo que va a suceder.

Esto sería mejor ya que la identificación hace más claramente lo que se pretende

perl -e "($f = $_) =~ s/JPG$/jpg/i and rename $_, $f while <*.JPG>"