Esto también se puede hacer con xargs
y sed
para cambiar la extensión del archivo.
ls | grep \.png$ | sed 'p;s/\.png/\.jpg/' | xargs -n2 mv
Puede imprimir el nombre de archivo original junto con el que desea que sea el nombre de archivo. Luego haga que xargs use esos dos argumentos en el comando de movimiento. Para el resumen, también agregué un grep para filtrar todo lo que no sea un archivo *.png.
¿Cómo cambio el nombre del archivo para que solo pueda tener una extensión?
cd dir/with/messedup/files
for file in *.png.jpg; do
mv "$file" "${file%.png.jpg}.jpg"
done
en el futuro, usando xargs, ¿cómo cambio la extensión del archivo simular a segundo comando?
Que yo sepa, eso no se puede hacer. La mejor manera de hacerlo sería usar un bucle for con sustitución de parámetros como el de arriba:
for file in *.png; do
convert "$file" -resize "${file%.png}.jpg"
done
Si tiene archivos en subdirectorios que desea convertir, puede canalizar find
a un while read
bucle:
find . -type f -name '*.png' |
while read file; do
convert "$file" -resize "${file%.png}.jpg"
done
NOTA: Generalmente se considera una mala idea usar la salida de ls
en un script de shell. Si bien su ejemplo podría haber funcionado bien, hay muchos ejemplos en los que no funciona. Por ejemplo, si sus nombres de archivo tienen líneas nuevas (lo que Unix permite), ls
probablemente no escapará de eso por ti. (Eso en realidad depende de su implementación, que es otra razón para no usar ls
en guiones; su comportamiento varía mucho de un cuadro a otro). Obtendrá resultados más consistentes si usa find
en un ciclo de lectura durante la lectura o archivo globbing (por ejemplo, *.png
) en un bucle for.