Operaciones con archivos en Bash

Iniciado por JuszR, 5 Agosto 2010, 15:58 PM

0 Miembros y 1 Visitante están viendo este tema.

JuszR

¿Qué está mal en este código?
Código (bash) [Seleccionar]
#!/usr/bin/env bash
# Operaciones con archivos
# Saber si es archivo, folder, vacio, ejecutable, de lectura...

echo "Dame el nombre de un archivo"
read ENTRADA

if [ -s $ENTRADA ]; then
echo "$ENTRADA es un archivo y no esta vacio"
if [ -x $ENTRADA ]; then
echo "$ENTRADA es ejecutable"
fi
if [ -r $ENTRADA ]; then
echo "$ENTRADA es de lectura"
fi
if [ -w $ENTRADA ]; then
echo "$ENTRADA es de escritura"
fi

elif [ -f $ENTRADA ]; then
echo "$ENTRADA es un archivo y no directorio, pero esta vacio"
elif [ -d $ENTRADA ]; then
echo "$ENTRADA es una carpeta"
else
echo "$ENTRADA no existe!"
fi


Si pongo un archivo o carpeta, siempre me dirige al primer IF, como si fuera un archivo no vacío.  :huh:
- No programming language is perfect. There is not even a single best language; there are only languages well suited or perhaps poorly suited for particular purposes. [Herbert Mayer]

leogtz

#1
El error está en que los if's están dentro del primer if's, están anidados.

Sácalos de ahí y ponlos con elif.

Código (bash) [Seleccionar]
if [ -s $ENTRADA ]; then
echo "$ENTRADA es un archivo y no esta vacio"
elif [ -x $ENTRADA ]; then
echo "$ENTRADA es ejecutable"
elif [ -r $ENTRADA ]; then
echo "$ENTRADA es de lectura"
elif [ -w $ENTRADA ]; then
echo "$ENTRADA es de escritura"
elif [ -f $ENTRADA ]; then
echo "$ENTRADA es un archivo y no directorio, pero esta vacio"
elif [ -d $ENTRADA ]; then
echo "$ENTRADA es una carpeta"
else
echo "$ENTRADA no existe!"
fi
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

JuszR

Pero si quiero imprimir también -x, -w y -r cuando es archivo no puedo.

Al parecer, la shell toma carpetas también como archivos. ;D
- No programming language is perfect. There is not even a single best language; there are only languages well suited or perhaps poorly suited for particular purposes. [Herbert Mayer]

leogtz

#3
Código (bash) [Seleccionar]
#!/usr/bin/bash
read -p "Archivo : " file
if [ ! -z $file ]
then
if [ -f $file ]
then
echo -e "Archivo";

if [ -x $file ]
then
echo -e "Permisos ejecutable";
fi

if [ -r $file ]
then
echo -e "Permisos lectura";
fi

if [ -w $file ]
then
echo -e "Permisos Escritura";
fi

else
echo -e "Directorio";
fi
else
echo -e "Entrada incorrecta.";
fi



leo@lein:~/Escritorio$ bash shell.sh
Archivo : /
Directorio
leo@lein:~/Escritorio$ bash shell.sh
Archivo : ./pl.pl
Archivo
Permisos ejecutable
Permisos lectura
Permisos Escritura
leo@lein:~/Escritorio$ bash shell.sh
Archivo : ~
Directorio
leo@lein:~/Escritorio$ bash shell.sh
Archivo : $HOME
Directorio
leo@lein:~/Escritorio$ bash shell.sh
Archivo : ./vocabulario.txt
Archivo
Permisos lectura
Permisos Escritura
leo@lein:~/Escritorio$


Código (bash) [Seleccionar]
#!/usr/bin/bash
read -p "Entrada : " file
[ ! -z "${file}" ] && (

[ -f "${file}" ] && (
echo -e "Archivo";

[ -x "${file}" ] && (
echo -e "Permiso ejecutable";
)

[ -r "${file}" ] && (
echo -e "Permiso lectura";
)

[ -w "${file}" ] && (
echo -e "Permiso escritura";
)
) || (
echo -e "Directorio";
)

) || (
echo -e "Entrada incorrecta.";
)
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

JuszR

Muy bueno!
Ahora solo unas preguntas: Porqué no usaste -s? O cómo podría saber si es archivo y está vacío?


Y ésta línea qué hace?
Código (bash) [Seleccionar]

if [ ! -z $file ]
- No programming language is perfect. There is not even a single best language; there are only languages well suited or perhaps poorly suited for particular purposes. [Herbert Mayer]

leogtz

Comprueba que la cadena no esté vacía.

Código (bash) [Seleccionar]
if [ ! -s $file ]
    print "$file is empty"
else
    print "$file has content"
fi
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

JuszR

Ok, solo una cosa más... Hice un archivo (echo "" > a) y aparece como si no estuviera vacío. :huh:
- No programming language is perfect. There is not even a single best language; there are only languages well suited or perhaps poorly suited for particular purposes. [Herbert Mayer]

leogtz

Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

JuszR

- No programming language is perfect. There is not even a single best language; there are only languages well suited or perhaps poorly suited for particular purposes. [Herbert Mayer]

leogtz

Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com