Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: JuszR en 5 Agosto 2010, 15:58 pm



Título: Operaciones con archivos en Bash
Publicado por: JuszR en 5 Agosto 2010, 15:58 pm
¿Qué está mal en este código?
Código
  1. #!/usr/bin/env bash
  2. # Operaciones con archivos
  3. # Saber si es archivo, folder, vacio, ejecutable, de lectura...
  4.  
  5. echo "Dame el nombre de un archivo"
  6. read ENTRADA
  7.  
  8. if [ -s $ENTRADA ]; then
  9. echo "$ENTRADA es un archivo y no esta vacio"
  10. if [ -x $ENTRADA ]; then
  11. echo "$ENTRADA es ejecutable"
  12. fi
  13. if [ -r $ENTRADA ]; then
  14. echo "$ENTRADA es de lectura"
  15. fi
  16. if [ -w $ENTRADA ]; then
  17. echo "$ENTRADA es de escritura"
  18. fi
  19.  
  20. elif [ -f $ENTRADA ]; then
  21. echo "$ENTRADA es un archivo y no directorio, pero esta vacio"
  22. elif [ -d $ENTRADA ]; then
  23. echo "$ENTRADA es una carpeta"
  24. else
  25. echo "$ENTRADA no existe!"
  26. fi

Si pongo un archivo o carpeta, siempre me dirige al primer IF, como si fuera un archivo no vacío.  :huh:


Título: Re: Operaciones con archivos en Bash
Publicado por: leogtz en 5 Agosto 2010, 18:36 pm
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
  1. if [ -s $ENTRADA ]; then
  2. echo "$ENTRADA es un archivo y no esta vacio"
  3. elif [ -x $ENTRADA ]; then
  4. echo "$ENTRADA es ejecutable"
  5. elif [ -r $ENTRADA ]; then
  6. echo "$ENTRADA es de lectura"
  7. elif [ -w $ENTRADA ]; then
  8. echo "$ENTRADA es de escritura"
  9. elif [ -f $ENTRADA ]; then
  10. echo "$ENTRADA es un archivo y no directorio, pero esta vacio"
  11. elif [ -d $ENTRADA ]; then
  12. echo "$ENTRADA es una carpeta"
  13. else
  14. echo "$ENTRADA no existe!"
  15. fi


Título: Re: Operaciones con archivos en Bash
Publicado por: JuszR en 5 Agosto 2010, 20:24 pm
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


Título: Re: Operaciones con archivos en Bash
Publicado por: leogtz en 5 Agosto 2010, 21:27 pm
Código
  1. #!/usr/bin/bash
  2. read -p "Archivo : " file
  3. if [ ! -z $file ]
  4. then
  5. if [ -f $file ]
  6. then
  7. echo -e "Archivo";
  8.  
  9. if [ -x $file ]
  10. then
  11. echo -e "Permisos ejecutable";
  12. fi
  13.  
  14. if [ -r $file ]
  15. then
  16. echo -e "Permisos lectura";
  17. fi
  18.  
  19. if [ -w $file ]
  20. then
  21. echo -e "Permisos Escritura";
  22. fi
  23.  
  24. else
  25. echo -e "Directorio";
  26. fi
  27. else
  28. echo -e "Entrada incorrecta.";
  29. fi
  30.  
  31.  

Código:
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
  1. #!/usr/bin/bash
  2. read -p "Entrada : " file
  3. [ ! -z "${file}" ] && (
  4.  
  5. [ -f "${file}" ] && (
  6. echo -e "Archivo";
  7.  
  8. [ -x "${file}" ] && (
  9. echo -e "Permiso ejecutable";
  10. )
  11.  
  12. [ -r "${file}" ] && (
  13. echo -e "Permiso lectura";
  14. )
  15.  
  16. [ -w "${file}" ] && (
  17. echo -e "Permiso escritura";
  18. )
  19. ) || (
  20. echo -e "Directorio";
  21. )
  22.  
  23. ) || (
  24. echo -e "Entrada incorrecta.";
  25. )


Título: Re: Operaciones con archivos en Bash
Publicado por: JuszR en 5 Agosto 2010, 21:42 pm
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
  1. if [ ! -z $file ]


Título: Re: Operaciones con archivos en Bash
Publicado por: leogtz en 5 Agosto 2010, 21:45 pm
Comprueba que la cadena no esté vacía.

Código
  1. if [ ! -s $file ]
  2.    print "$file is empty"
  3. else
  4.    print "$file has content"
  5. fi


Título: Re: Operaciones con archivos en Bash
Publicado por: JuszR en 5 Agosto 2010, 22:22 pm
Ok, solo una cosa más... Hice un archivo (echo "" > a) y aparece como si no estuviera vacío. :huh:


Título: Re: Operaciones con archivos en Bash
Publicado por: leogtz en 5 Agosto 2010, 22:27 pm
Crealo así:

Código:
: > file.txt

ó.

Código:
touch file.txt


Título: Re: Operaciones con archivos en Bash
Publicado por: JuszR en 5 Agosto 2010, 22:34 pm
Oh, gracias por todo. :D


Título: Re: Operaciones con archivos en Bash
Publicado por: leogtz en 5 Agosto 2010, 22:42 pm
De nada.