Estoy creando un script (más bien una función para un script) Bash, que
pedirá al usuario un texto para meter en un arxivo (mediante un simple
cat > ARCHIVO).
PERO (y aquí bien el 'kit' de la question) necesito controlar el tamaño
del archivo, y en caso de exceder-se volver a pedir-lo al usuario.
Para calcular el tamaño del archvio (en caracteres) hago un 'cat | wc -c'
después de ser creado y lo guardo en una variable A. Dado que 'wc' añade
espacios uso además awk para coger sólo el número.
El problema es que no consigo que bash trate A como un número para poder
comparar-lo con la variable donde guardo el limite de tamaño.
Aquí pego el pedazo de código que uso para mis intentos:
A=`cat archivo | wc -c | awk '{ print $1; }'`
LIMITE=6000
echo "Archivo: $A"
echo "Limite: $LIMITE"
if [ $A > $LIMITE ]; then
echo "Limite excedido"
else
echo "Limite ok"
fi
Supongo que hay mil formas de hacer lo que quiero, pero no tengo ningún
conocimiento de awk, y pocos usando bash para manejar números.
Gracias por qualquier sugerencia.
Salut
Count
El Fri, 18 Apr 2003 16:07:37 +0200, CountZero
exponía en su mensaje:
> Aquí pego el pedazo de código que uso para mis intentos:
>
> A=`cat archivo | wc -c | awk '{ print $1; }'`
> LIMITE=6000
> echo "Archivo: $A"
> echo "Limite: $LIMITE"
> if [ $A > $LIMITE ]; then
> echo "Limite excedido"
> else
> echo "Limite ok"
> fi
>
A mi me funciona si cambio la linea del if por esta
if (( "$A" > "$LIMITE" )); then
- --
Mainake <mai...@escomposlinux.org>
Debian 3.0 (Woody) --- Usuario Linux registrado nº: 90215
PGP Pub Key en pgp.escomposlinux.org ID:0x68EB97FD
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.0 (GNU/Linux)
iD8DBQE+oBD1wanSomjrl/0RAnoYAJ9tmhV7J96NmhJZQkXJS4swT941EQCcCf8I
gh0GXaXTdq5cId9knqpGS5w=
=PwHd
-----END PGP SIGNATURE-----
He descubierto (al contrario que en la doc que yo tenía), que debía usar
el '-gt' en lugar del simple e intuitivo '>' para hacer la comparción, lo
he probado y me funciona.
Más tarde, y para más INRI me he dado cuenta que en mi script no necesito
controlar el tamaño del archvio ;(.
(Podeis reiros)
Salut
Count
>>>>> "CountZero" == CountZero <ma...@l3jane.net> writes:
CountZero> El problema es que no consigo que bash trate A como un
CountZero> número para poder comparar-lo con la variable donde
CountZero> guardo el limite de tamaño.
El shell no tiene variables numericas. Son _SIEMPRE_ cadenas de
caracteres. De hecho ni siquiera tiene operaciones de comparacion o
aritmeticas.
Hay que usar la orden 'test' tambien conocida como '[' (si, aunque
parezca mentira, esos if [ ] que escribimos son en realidad la
ejecucion de una orden llamada '[', no es que la sintaxis del if
obligue a poner corchetes)
Si miras la pagina del manual de test, veras que tiene operadores de
comparacion de cadenas y de numeros. Necesitas usar estos
ultimos. Vamos, algo como (las comillas dobles no son obligatorias,
pero si _altamente_ recomendables):
if [ "$A" -gt "$LIMITE" ]
then
...
fi
que es en realidad lo mismo (y cuando digo lo mismo es que es
_literalmente_ lo mismo) que:
if test "$A" -gt "$LIMITE"
then
...
fi
Saludos. Iñaki.
- --
Get PGP/GPG Keys at http://www.escomposlinux.org/iarenaza/pgpkey.php
I use free software / Yo uso software libre
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
Comment: Processed by Mailcrypt 3.5.6 <http://mailcrypt.sourceforge.net/>
iD8DBQE+oBltZXLnGT1HLgcRAm6eAKCKf52SDW5lrbY/rJsABpYY58ka8wCfcPrL
8SrIVyZxyKd7xPOHqp+TfqI=
=lYhD
-----END PGP SIGNATURE-----
Un apunte nada más:
> Para calcular el tamaño del archvio (en caracteres) hago un 'cat | wc -c'
> después de ser creado y lo guardo en una variable A. Dado que 'wc' añade
> espacios uso además awk para coger sólo el número.
Mejor 'wc -c archivo' y así nos ahorramos un proceso. De todas formas, si
luego vas a llamar a awk, pienso que sería más efectivo hacer un programita
enano que hiciera stat() sobre el archivo e imprimiese por stdout el tamaño.
--
David Serrano <cyberchat2000.com@hue> - Linux Registered User #87069
Cuando: Sat, 19 Apr 2003 17:24:45 +0000 (UTC)
Quien: Hue-Bond <eco...@cyberchat2000.com>
Que: Re: Aritmetica en bash (comparando tamaños de archivos)
> Mejor 'wc -c archivo' y así nos ahorramos un proceso.
¿wc -c < archivo?
- --
Benjamín Albiñana Pérez
"Recientemente he conseguido usar vim, via telnet, en un Nokia Communicator,
y ahora puedo decir que funciona de maravilla en un Palm Pilot"
Allan Kelly :h quotes.txt
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.0 (GNU/Linux)
iD8DBQE+oZDE633hg168lHwRApXbAKCHLwPnGoEobrdRfRx6E3RCMF3tswCgzj8R
symQtPOUYe/EaMm8ILGth6I=
=o8TU
-----END PGP SIGNATURE-----
> Mejor 'wc -c archivo' y así nos ahorramos un proceso.
Totalmente de acuerdo. Tiendo a abusar de la flexibilidad de la
herramientas UNIX, pipes, redirecciones, scripts, ....
Eso me viene al dedo para un tema al que le iba dando vueltas útlimamente.
Alguien sabría dar una tabla simplilla (o algún enlace) donde se
resumieran que llamadas (en quanto a scripts se refiere) crean un nuevo
proceso, una nueva shell y cuales no.
Por ejemplo comparar exec, bloques tipo ( <orden> ) | comando, etc ..
Supongo que es el colmo del programa eficiente, y es abusar del grupo
preguntar esto, pero seguramente está esparcido en varia documentación y
una mini-tabla que lo sintetize no estaria nada mal.
Salut
Count
No ahorra nada. En ambos casos se crea un nuevo proceso; lo único que cambia
es el descriptor de archivo del que wc lee. Aquí un par de ejemplos con un
archivo de >2000 líneas:
$ time for I in `seq 1 100`; do wc -l file > /dev/null; done
real 0m4.098s
user 0m2.650s
sys 0m0.940s
real 0m4.155s
user 0m2.750s
sys 0m0.800s
real 0m4.169s
user 0m2.860s
sys 0m0.750s
$ time for I in `seq 1 100`; do wc -l < file > /dev/null; done
real 0m4.212s
user 0m2.960s
sys 0m0.700s
real 0m4.045s
user 0m2.810s
sys 0m0.760s
real 0m4.158s
user 0m2.750s
sys 0m0.830s
Bueno, cualquier cosa que esté en cualquier directorio */bin es un programa
y al ejecutarlo, se crea un proceso nuevo. El ejemplo de "cat | algo" cuando
ese algo ya puede leer de un archivo es muy claro. Una tubería siempre crea
dos procesos.
Sobre qué cosas provocan la creación de un nuevo shell, eso es asunto de
cada shell y debe ponerlo en la documentación. En el caso de bash, una
búsqueda de "subshell" en el man da algunas pistas.
>> Mejor 'wc -c archivo' y así nos ahorramos un proceso.
>
> ¿wc -c < archivo?
Sin el '<' funciona perfectamente, aunque con él también, claro
solo hay que mirar el man:
SYNOPSIS
wc [OPTION]... [FILE]...
Un saludo.
--
José Antonio Calvo <jo...@escomposlinux.org>
Linux Registered User #194638
Powered by Debian GNU/Linux sid
Cuando: Sun, 20 Apr 2003 12:17:03 +0200
Quien: José Antonio Calvo <jo...@escomposlinux.org>
Que: Re: Aritmetica en bash (comparando tamaños de archivos)
>>> Mejor 'wc -c archivo' y así nos ahorramos un proceso.
>>
>> ¿wc -c < archivo?
>
> Sin el '<' funciona perfectamente, aunque con él también, claro
> solo hay que mirar el man:
Luego te diré en #escomposlinux a quién le vas tú a hacer RTFM.
La idea es que 'wc -c < archivo' devuelve sólo el número de
carácteres, sin añadir el nombre del fichero al final, como hace
'wc -c archivo'. No había comprobado que hacía el awk que venía
después. Cosas de escribir aquí sin leer todo el mensaje.
Voy por el bate de beisbol con pinchos. Ahora nos vemos.
- --
Benjamín Albiñana Pérez
Los dioses que sonrieron cuando naciste, ahora se están descojonando.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.0 (GNU/Linux)
iD8DBQE+ordk633hg168lHwRAvgHAKC3uK0He6XvME8QR9235f6o1Ox6UwCfdaQ+
RMGcSzRSwNfYcYftN6QwtOc=
=5Tt3
-----END PGP SIGNATURE-----
Juas _Josh_ para una vez que posteas ¡¡le haces un RTFM a foobar!!
eres mi heroe xDDD
--
Santiago Romero AKA NoP/Compiler (Linux User #74.821)
http://www.escomposlinux.org/sromero/ y http://www.speccy.org/
compiler(*)escomposlinux.org
>
> Juas _Josh_ para una vez que posteas ¡¡le haces un RTFM a foobar!!
> eres mi heroe xDDD
Precisamente... no suelo postear, pero si hay ocasión de hacerle un
RTMF a Benja se puede hacer una excepción ;-)
Cuando: Mon, 21 Apr 2003 18:36:16 +0200
Quien: José Antonio Calvo <jo...@escomposlinux.org>
Que: [OT] Re: Aritmetica en bash (comparando tamaños de archivos)
> Precisamente... no suelo postear, pero si hay ocasión de hacerle un
> RTMF a Benja se puede hacer una excepción ;-)
^^^^
¿Read Too Many Files?...
Ah, no.
User-Agent: Gnus/5.090015 (Oort Gnus v0.15) Emacs/21.2
Esto explica muchas cosas.
- --
Benjamín Albiñana Pérez
Si la educación te parece cara, prueba con la ignorancia.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.0 (GNU/Linux)
iD8DBQE+pDoH633hg168lHwRAos+AJ9CXfIAqbixpuuZ5ySfj7b2Eew1zACghjkP
0WVTmXK5kGwBFq18CmWNC8U=
=YcuJ
-----END PGP SIGNATURE-----
>>>>> "Benjamín" == Benjamín Albiñana <benj...@hierroycuero.org> writes:
Benjamín> User-Agent: Gnus/5.090015 (Oort Gnus v0.15) Emacs/21.2
Benjamín> Esto explica muchas cosas.
Me huelo que vamos a llevar este hilo a es.comp.os.linux.misc para
tener un buen flame-war sin que sea off-topic en el grupo...
Saludos. Iñaki.
- --
Get PGP/GPG Keys at http://www.escomposlinux.org/iarenaza/pgpkey.php
I use free software / Yo uso software libre
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
Comment: Processed by Mailcrypt 3.5.6 <http://mailcrypt.sourceforge.net/>
iD8DBQE+pHvGZXLnGT1HLgcRAuISAJwMQ0B4GDz7sMyfAQdgxYMC6F/6EwCfUenb
6V6zI/kHzZWnF4Xkiuyu6RQ=
=/8Sb
-----END PGP SIGNATURE-----
> Benjamín Albiñana <benj...@hierroycuero.org> writes:
>
> >> Mejor 'wc -c archivo' y así nos ahorramos un proceso.
> >
> > ¿wc -c < archivo?
>
> Sin el '<' funciona perfectamente, aunque con él también, claro
> solo hay que mirar el man:
>
> SYNOPSIS
> wc [OPTION]... [FILE]...
>
> Un saludo.
No diria que funciona también:
[pascal@thalassa misc]$ wc < wang
32 268 1579
[pascal@thalassa misc]$ wc wang
32 268 1579 wang
Veo una diferencia bastante importante.
En el caso, se queria el número de caracteres en el archivo, no el
nombre del archivo. Por eso estaba mejor usar `wc -c < archivo` en lugar
de `wc -c archivo`:
[pascal@thalassa misc]$ echo $(( 1 + $( wc -c < wang ) ))
1580
[pascal@thalassa misc]$ echo $(( 1 + $( wc -c wang ) ))
bash: 1 + 1579 wang : syntax error in expression (error token is "wang ")
--
__Pascal_Bourguignon__ http://www.informatimago.com/
----------------------------------------------------------------------
Do not adjust your mind, there is a fault in reality.
Usar "wc" para saber el tama~no de un fichero es totalmente
incorrecto, no hay por que leerse todo el fichero, con el
consiguiente deperdicio de ancho de banda de bus y/o red y
con el desgaste de medio fisico que puede suponer:
$ ls -l $file | read a b c d size foo
$ echo $size
951644160
Ademas, alguien decia que no hay variables numericas en
el shell. Eso, en shells POSIX o en bash, no es correcto:
typeset [-afFirx] [-p] [name[=value]]
-i The variable is treated as an integer; arithmetic
evaluation (see ARITHMETIC EVALUATION ) is per-
formed when the variable is assigned a value.
--
finger s...@shiva.cps.unizar.es for PGP /
.mailcap tip of the day: / La vida es una carcel
application/ms-tnef; cat '%s' > /dev/null / con las puertas abiertas
text/x-vcard; cat '%s' > /dev/null / (A. Calamaro)
>>>>> "J" == J A Gutierrez <s...@daphne.cps.unizar.es> writes:
J> Ademas, alguien decia que no hay variables numericas en el
J> shell. Eso, en shells POSIX o en bash, no es correcto:
Lo decia yo, y ahora mismo no recuerdo si llegue a especificarlo, pero
me referia al Bourne Shell. Perdon por la confusion que esto haya
podido causar.
Saludos. Iñaki.
- --
Get PGP/GPG Keys at http://www.escomposlinux.org/iarenaza/pgpkey.php
I use free software / Yo uso software libre
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
Comment: Processed by Mailcrypt 3.5.6 <http://mailcrypt.sourceforge.net/>
iD8DBQE+qVXaZXLnGT1HLgcRAj8AAJ4+sC2YsV1IftQ3VtCY40dxt7FkDwCeO47s
mo/zO+8lRR9q9b1jCLyFJxM=
=g45G
-----END PGP SIGNATURE-----
>
> Tanta discusion, y nadie dice nada de lo fundamental:
>
> Usar "wc" para saber el tama~no de un fichero es totalmente
> incorrecto, no hay por que leerse todo el fichero, con el
> consiguiente deperdicio de ancho de banda de bus y/o red y
> con el desgaste de medio fisico que puede suponer:
Discrepo de manera teorica:
ls da el tamaño del archivo en octeto.
wc (con el opción -m) cuenta los caraterios en el archivo.
Cuando este archivo contiene UTF-8, (u otros encodajes también), el
número de caracterios no es igual al número de octetos.
Entonces, el problema no es que usé de wc, pero que se olvidó de poner
el opción -m (dijó que quería el número de caracterios).
> $ ls -l $file | read a b c d size foo
> $ echo $size
> 951644160
>
> Ademas, alguien decia que no hay variables numericas en
> el shell. Eso, en shells POSIX o en bash, no es correcto:
>
> typeset [-afFirx] [-p] [name[=value]]
>
> -i The variable is treated as an integer; arithmetic
> evaluation (see ARITHMETIC EVALUATION ) is per-
> formed when the variable is assigned a value.
--
:>
:> Tanta discusion, y nadie dice nada de lo fundamental:
:>
:> Usar "wc" para saber el tama~no de un fichero es totalmente
:> incorrecto, no hay por que leerse todo el fichero, con el
:> consiguiente deperdicio de ancho de banda de bus y/o red y
:> con el desgaste de medio fisico que puede suponer:
: Discrepo de manera teorica:
: ls da el tamaño del archivo en octeto.
: wc (con el opción -m) cuenta los caraterios en el archivo.
: Cuando este archivo contiene UTF-8, (u otros encodajes también), el
: número de caracterios no es igual al número de octetos.
hmmm
en parte tienes razon; pero el mensaje inicial hablaba de
"tama~no" del fichero con intencion de averiguar si cabia
o no en no se donde, asi que en este caso no se aplica.