Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Aritmetica en bash (comparando tamaños de archivos)

1,030 views
Skip to first unread message

CountZero

unread,
Apr 18, 2003, 10:07:37 AM4/18/03
to
Quizá sea más fàcil de lo que creo, pero he intentado varios mètodos y no
me salgo con la mía.

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

Mainake

unread,
Apr 18, 2003, 10:51:33 AM4/18/03
to
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

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-----

CountZero

unread,
Apr 18, 2003, 11:09:08 AM4/18/03
to
Me respondo a mi mismo en probablemente el artículo más inútil que yo he
posteado aquí.

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

Iñaki Arenaza

unread,
Apr 18, 2003, 11:27:41 AM4/18/03
to
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

>>>>> "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-----

Hue-Bond

unread,
Apr 19, 2003, 1:24:45 PM4/19/03
to
On Fri, 18 Apr 2003 16:07:37 +0200, CountZero <ma...@l3jane.net> wrote:
>

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

Benjamín Albiñana

unread,
Apr 19, 2003, 2:09:09 PM4/19/03
to
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

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-----

CountZero

unread,
Apr 19, 2003, 4:15:14 PM4/19/03
to
Eso que el día Sat, 19 Apr 2003 17:24:45 +0000 iba Hue-Bond y dijo:

> 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

Hue-Bond

unread,
Apr 19, 2003, 5:26:49 PM4/19/03
to
On Sat, 19 Apr 2003 18:09:09 +0000 (UTC), Benjamín Albiñana
<benj...@hierroycuero.org> wrote:
>
>> Mejor 'wc -c archivo' y así nos ahorramos un proceso.
>
> ¿wc -c < archivo?

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

Hue-Bond

unread,
Apr 19, 2003, 5:38:24 PM4/19/03
to
On Sat, 19 Apr 2003 22:15:14 +0200, CountZero <ma...@l3jane.net> wrote:
>
> 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.

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.

José Antonio Calvo

unread,
Apr 20, 2003, 6:17:03 AM4/20/03
to
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.

--
José Antonio Calvo <jo...@escomposlinux.org>
Linux Registered User #194638
Powered by Debian GNU/Linux sid

Benjamín Albiñana

unread,
Apr 20, 2003, 11:06:13 AM4/20/03
to
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

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-----

Santiago Romero

unread,
Apr 21, 2003, 4:32:25 AM4/21/03
to
El Sun, 20 Apr 2003 12:17:03 +0200, José Antonio Calvo escribió:
> 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]...

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

José Antonio Calvo

unread,
Apr 21, 2003, 12:36:16 PM4/21/03
to
Santiago Romero <sro...@escomposlinux.org> writes:

>
> 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 ;-)

Benjamín Albiñana

unread,
Apr 21, 2003, 2:35:52 PM4/21/03
to
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

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-----

Iñaki Arenaza

unread,
Apr 21, 2003, 7:16:22 PM4/21/03
to
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

>>>>> "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-----

Pascal Bourguignon

unread,
Apr 23, 2003, 7:55:49 PM4/23/03
to
jo...@escomposlinux.org (José Antonio Calvo) writes:

> 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.

J.A. Gutierrez

unread,
Apr 25, 2003, 6:33:23 AM4/25/03
to


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:

$ 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)

Iñaki Arenaza

unread,
Apr 25, 2003, 11:35:54 AM4/25/03
to
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

>>>>> "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-----

Pascal Bourguignon

unread,
Apr 26, 2003, 11:08:39 AM4/26/03
to
"J.A. Gutierrez" <s...@daphne.cps.unizar.es> writes:

>
> 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.

--

J.A. Gutierrez

unread,
Apr 28, 2003, 3:38:09 AM4/28/03
to
Pascal Bourguignon <sp...@thalassa.informatimago.com> wrote:
: "J.A. Gutierrez" <s...@daphne.cps.unizar.es> writes:

:>
:> 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.

carbaja...@gmail.com

unread,
Mar 8, 2017, 7:57:26 PM3/8/17
to


Estimado muy interesante el caso que planteas, mira tengo el mismo problema me mandaron calcular el tamaño de un archivo mediante un script para integrarlo al nagios si podias pasar tu scritp completo para modificarlo estaria muy agradecido carbaja...@gmail.com
0 new messages