Conversión de todos los archivos con extensión. (dentro o no de un directorio..)
Publicado por Autodolor (4 intervenciones) el 17/09/2018 12:16:15
Buenas sean.
Tengo un rompecabezas (para mí, ya que no soy ducho en perl..)
Tengo un script -no es mío, sino de un libro de VRML de hace unos 25 años...,que, digamos, reduce valores de precisión doble a simple. No sé si parece "correcto", pero en mi caso sí es muy importante, ya que trabajo con secuencias de formato 3D tipo Wavefront .obj.
Este formato crea "posiciones" en XYZ con excesivos decimales, y éste script, los reduce a dos, con la consabida ganancia de "menor peso" en Kb o Mb.. sin afectar a la topología del modelo.
Funciona estupendamente en cualquier tipo de formato con números en UTF8 o ANSI, pero, tengo que pasar este script por unos 300/900/2000 archivos .obj, o de extensión .X. Es lo mismo. Lo que quiero es si me podeis ayudar en que esto se aplique a todos los archivos dentro de un directorio
El script es el siguiente:
---------------------
Creo que el principal problema viene con asignar un fichero en su uso, que sería, (uso windows 10 con Strawberry perl..) en línea de comandos : archivo.pl xxxx.obj.
Creo, por lo visto, que si uso (usó el programador original...) de ARGV, se identifica el nombre. Sin embargo, lo deseable sería todos los archivos con extensión tipo .obj, o de .txt con datos "superfluos...". En este caso, la extensión es lo de menos.
Si hago un script tipo ---------> for i in folder/* ; do perl NOMBRE.pl <$i; done , digamos una llamada al script para todos, no funciona por el condicionante de nombre de ARGV...
No sé si me explico bien, dados mis escasos conocimientos de Perl...
Sólo es cambiar "un nombre específico de archivo" por todos los de ".extensión", y no sé resolver esto. Y, en este caso lo que genera es un archivo "xxx.obj.new". Es claro que renombrar todo ese tamaño de archivos, también es un poco cansino. Tal vez, crear un "new_xx.obj" y evitar esa tediosa faena.. (ya, por pedir..) :D
Gracias por vuestra ayuda de antemano, y disculpad si no se cómo poner en sintaxis el script..
Tengo un rompecabezas (para mí, ya que no soy ducho en perl..)
Tengo un script -no es mío, sino de un libro de VRML de hace unos 25 años...,que, digamos, reduce valores de precisión doble a simple. No sé si parece "correcto", pero en mi caso sí es muy importante, ya que trabajo con secuencias de formato 3D tipo Wavefront .obj.
Este formato crea "posiciones" en XYZ con excesivos decimales, y éste script, los reduce a dos, con la consabida ganancia de "menor peso" en Kb o Mb.. sin afectar a la topología del modelo.
Funciona estupendamente en cualquier tipo de formato con números en UTF8 o ANSI, pero, tengo que pasar este script por unos 300/900/2000 archivos .obj, o de extensión .X. Es lo mismo. Lo que quiero es si me podeis ayudar en que esto se aplique a todos los archivos dentro de un directorio
El script es el siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
for ($x=-1; $x++ < $#ARGV; ) {
$file = $ARGV[$x];
if (! (-e $file) ) {
print "$file not found, skipping...\n";
next;
}
&convert($file);
}
exit;
sub convert {
local ($file)= @_;
open (OLD, $file) || die "Couldn´t open $file: $!\n";
open (NEW, ">$file.new") || die "Couldn´t open $file.new: $!\n";
while (<OLD>) {
$line = $_;
if (/Normal/) { while (<OLD>) { last if /}/; } Sline => ""; }
if (/normalIndex/) { while(<OLD>) { last if /[]]/; } $line = ""; }
$line =~ s/[-+]?[0-9]\.[0-9]+e[+-][0-9]+/0/g;
$line =~ s/([-+]?[0-9]+\.[0-9]{2})[0-9]+/$1/g;
$line =~ s/0\.00/0/g;
$line =~ s/[ ]+/ /g;
$line =~ s/[\t]+/ /g;
$line =~ s/^ //g;
print NEW $line;
}
close OLD;
close NEW;
---------------------
Creo que el principal problema viene con asignar un fichero en su uso, que sería, (uso windows 10 con Strawberry perl..) en línea de comandos : archivo.pl xxxx.obj.
Creo, por lo visto, que si uso (usó el programador original...) de ARGV, se identifica el nombre. Sin embargo, lo deseable sería todos los archivos con extensión tipo .obj, o de .txt con datos "superfluos...". En este caso, la extensión es lo de menos.
Si hago un script tipo ---------> for i in folder/* ; do perl NOMBRE.pl <$i; done , digamos una llamada al script para todos, no funciona por el condicionante de nombre de ARGV...
No sé si me explico bien, dados mis escasos conocimientos de Perl...
Sólo es cambiar "un nombre específico de archivo" por todos los de ".extensión", y no sé resolver esto. Y, en este caso lo que genera es un archivo "xxx.obj.new". Es claro que renombrar todo ese tamaño de archivos, también es un poco cansino. Tal vez, crear un "new_xx.obj" y evitar esa tediosa faena.. (ya, por pedir..) :D
Gracias por vuestra ayuda de antemano, y disculpad si no se cómo poner en sintaxis el script..
Valora esta pregunta


0