Comprobar si un archivo o carpeta existe o no (y más) con ciclo IF

Hace rato no pongo nada de Bash, y es que al estar adentrándome en el maravilloso mundo de Python he olvidado un poco a este otro amigo que tanto me ayudó 🙂

Aquí les pongo algo a los entusiastas de Bash, como bien dice el título… les mostraré cómo comprobar si existe o no un archivo o carpeta en el sistema, solo usando: if

Vamos a crear un archivo .sh y darle permisos de ejecución, para ello basta con poner el siguiente comando en una terminal:

touch prueba.sh && chmod +x prueba.sh

Esto lo que hizo es crear el archivo (touch prueba.sh) y además darle permisos de ejecución (chmod +x prueba.sh)

Luego escribamos lo siguiente en él:

if [ -d /opt/ ];
then
echo "Sí, sí existe."
else
echo "No, no existe"
fi

¿Qué hace esto?

Simple 😀

En la primera línea -» if [ -d /opt/ ];

Aquí preguntamos, ¿existe el directorio /opt/? Sí directorio/carpeta, pues el -d significa directorio o carpeta.
Luego en caso de que exista imprimiremos en la terminal «Sí, sí existe.» (esto es la línea 2 y 3)
En caso contrario y NO exista /opt/, entonces imprimiremos «No, no existe» (línea 4 y 5)
Luego en la última línea (la número 6) cerramos el if y listo.

Artículo relacionado:
Establecer conexión de red entre la PC y las maquinas virtuales de Virtualbox

Hagan la prueba, les mostrará que /opt/ sí existe.

Si desean que les muestre el otro texto (el de que no existe) cambien /opt/ por cualquier otra carpeta que no exista en su sistema, por ejemplo: /asd/

Como ven, -d nos sirve para saber si el directorio existe, bien ahora si cambiamos -d por -f es para comprobar existencia de archivos (-d = directorio, -f = file/archivo)

Por ejemplo:

if [ -f /etc/hosts ];
then
echo "Sí, sí existe."
else
echo "No, no existe"
fi

Aquí el listado de las opciones:

-d -» Comprobar si existe determinado directorio

-f -» Comprobar si existe determinado archivo

-w -» Comprobar si determinado archivo tiene permisos de escritura

-x -» Comprobar si determinado archivo tiene permisos de ejecución.

Y bueno no hay mucho más que agregar 🙂

Sé que esto le será muy útil e interesante para aquellos que gustan de programar en Bash 😉

Saludos


42 comentarios, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   Hugo dijo

    Otra forma de hacerlo sin if…then..else :

    test -f /etc/hosts && elcomando

    O también

    test ! -f /etc/hosts && echo "no se encontró el archivo"

    Etcétera.

    1.    KZKG^Gaara dijo

      Cierto 😀
      … O_O … Eres Hugo, Hugo de Cuba? … Usando Windows8, WTF!!!

      1.    Hugo dijo

        Pues si, me estoy familiarizando con este OS y si he de serte franco, lo único que le he encontrado útil es el gestor de copias, por lo demás personalmente me parece una plasta, especialmente su interfaz híbrida y las aplicaciones de metro. Me gusta menos que el Vista y el 7 (aunque sea un poco mas eficiente que estos), que tampoco me gustaban. Para lo único que lo estoy usando es para jugar NFS13 y Skyrim, pero este OS se lleva tanto espacio que tuve que eliminar mi partición de Linux [snif].

        No obstante, para tu tranquilidad, te comento que anteayer descargué el ISO de Arch de enero y pienso darle una probadita en su versión x86-64, en cuanto consiga el repo (de casualidad lo tendrás?). Ahora que segun vi usa por defecto paquetes firmados, me da mayor confianza zambullirme.

        Y además mi padre me dijo que me mandaría un Sony Xperia, que quiero aprovechar para aprender algo de programación para Android, que era un deseo pendiente. Así que tranquilízate, aun no me he pasado al lado oscuro de la fuerza, buahahahaha 😉

  2.   patz dijo

    man test

    1.    msx dijo

      Claro.

  3.   RAW-Basic dijo

    Wenas!..

    Podríamos hacer uno igual.. ..pero que el directorio sea pasado por parámetro..

    if [ -d $1 ];
    then
    echo "Sí, sí existe."
    else
    echo "No, no existe"
    fi

    Y lo llamamos como:

    ./prueba.sh /opt/

    Saludo..

  4.   savo dijo

    IF no es un ciclo xD

  5.   Gregorio Espadas dijo

    Me viene como anillo al dedo para un script que estoy haciendo. ¿Es válido usar comodines? Por ejemplo, para saber si existe algún .mp4 entonces ejecutar algo sobre ellos.

    if [ -f *.mp4 ];

    1.    RAW-Basic dijo

      Sí, es totalmente válido..

      Incluso a través de parámetros.. «*.mp4»

      1.    RAW-Basic dijo

        Por ejemplo,

        if [ -f $1 ];
        then
        rm -r $1
        else
        ls
        fi

        Si lo llamas: ./prueba.sh *.mp4

        Si encuentra archivos .mp4 los borra.. ..sino te lista los archivos de ese directorio..

        1.    Gregorio Espadas dijo

          ¡Gracias por el feedback y tips! 🙂

        2.    Joaquin dijo

          Te faltó la f xD

          rm -rf $1

          Así es más emocionante!

        3.    b1tblu3 dijo

          Maravilloso!!!, Cada día me enamoro más de Linux, Windows ha quedado relegado en algún rincón oscuro de mi Disco Duro, al cual esta a punto de ser borrado para dar paso a la luz de Linux.

          1.    RAW-Basic dijo

            Excelente!.. ..entonces haz el siguiente paso..y sácalo..

            Hace 6 meses aprox. que tengo en todas mis máquinas sólo GNU/Linux y no necesito de más.. ..ni de W$..ni Wine.. ..y soy más que feliz así.. 😉

            Y voy contagiando a mis alrededores..ya que todos me ven con mi Arch, rápido, eficiente y feliz.. ..y me piden que les instale Linux.. ..yeah!.. 😀

        4.    Inukaze dijo

          Tambien puedes comprobrarlos por varias extensiones , puedes usar algo como

          #!/bin/bash
          Directorio=$HOME/Descargas

          if [ $Directorio ]; then
          echo «A Continuacion una Lista de Archivos Tipos :»
          echo «mp1 , mp2 , mp3 , mp4 , wav , flac , flaad , aud , midi»
          ls {*.mp?,*.wav,*.fla,*.aud*.midi}
          fi

          el usar {} te permite especificar varias extensiones en este caso , el uso de «?» , es un comodin , que le permite tomar «Cualquier Caracter».

          Espero que les sirva

        5.    pedro dijo

          Te aconsejo el comando find [directorio] [patrón_de_búsqueda] –exec [comando] {}\

      2.    Carlos dijo

        No funciona, puse estos archivos en el directorio:
        AB20160420.TXT
        AB20160421.TXT
        AB20160422.TXT
        AB20160423.TXT
        AB20160424.TXT
        AB20160425.TXT
        busca.sh

        #!/bin/bash
        RUTA=/tmp/PRUEBA
        cd $RUTA
        ls -la | awk ‘{print » «$9}’
        if [[ -f AB.TXT ]]; then
        echo » Ingreso al IF si existe cualquier AB
        .TXT»
        fi
        if [ -f AB20160422.TXT ]; then
        echo «ingreso para un archivo AB especifico»
        fi

        cuando pongo [ -f AB.TXT ] da error
        cuando pongo [[ -f AB
        .TXT ]] no da error pero no encuentra el archivo
        sólo funciona cuando pongo un archivo especifico, por ejemplo:
        if [ -f AB20160422.TXT ]; then

        No logro que funcione con comodines * o ?

        1.    pedro dijo

          #!/usr/bin/env bash
          #.encoding=utf-8.

          CONTSTANTS

          EXIT_OK=0
          EXIT_BAD=66

          BOLD=»\033[1m»
          NC=»\033[0m»
          RED=»\033[31m»

          if [ ! «$1» ];
          then
          echo «falta un parámetro»
          exit $EXIT_BAD
          fi

          cd «$1″

          files=»ls -h1 $1»

          for file in $($files); do
          echo -e «puedes hacer cualquier cosa con$BOLD $file$nc aquí»
          done

          exit $EXIT_OK

  6.   msx dijo

    @KZ, contá más sobre esto: «y es que al estar adentrándome en el maravilloso mundo de Python»!

    1.    KZKG^Gaara dijo

      JAJAJAJA nah… poco a poco 🙂
      Aún soy solo un novato en Python, casi no tengo tiempo ya para dedicarle horas y horas, por lo que voy lento sí, lento pero seguro en mi aprendizaje 😀

  7.   Audoban dijo

    Muchísimas gracias 😀 justo ayer andaba pensando como hacer esto.

  8.   ReichSk dijo

    esto con ncurses es genial 🙂

  9.   jazeco dijo

    en 1 palabra… ¡EXCELENTE!
    Hace mucho que estaba perfeccionando un script para realizar descargas desde Internet, pero me encontraba con el problema de que descargaba los archivos que le pedía 1 y otra vez sin poder comprobar la existencia 1ro.
    Muy buen tuto.

  10.   zulan dijo

    Tremendo aporte , acá desde chile se agradece.
    Cada dia mas LINUX me sorprende gratamente,
    Viva el Software Libre MIERDAAAA.

  11.   david dijo

    sirbe para
    verificar si un archivo es de un directorio

  12.   Grovher dijo

    si deseo comprobar la existencia de un fichero cualquiera en una ruta «/tmp/receptores» me ejecute un comando cualquiera, como seria?

    les estare muy agradecido

    Saludos

  13.   Juan dijo

    Estimados, y para determinar mendiante IF si el archivo se encuentra poblado en su totalidad ???. Lo pregunto debido a que cuando estas llenando el archivo por una transmision, este lo puede tomar incluso con la mitad de los datos.

    Saludos y gracias por la respuesta.

  14.   Inukaze dijo

    Bueno creo que tambien debiste agregar de ejemplo , como «Comprobrar que no existe» un «archivo» o «directorio» como por ejemplo

    para comprobrar que NO existe , por ejemplo usar una variable->

    Un Directorio

    #!/bin/bash
    Directorio=»$HOME/Directorio de Prueba»
    Archivo=»$HOME/Archivo de Prueba»

    if [ ! -d «$Directorio» ]; then
    echo «No existe $Directorio»
    echo «Creando -> «$Directorio»
    mkdir «$Directorio»
    else
    echo «El Directorio «$Directorio» ya existe
    fi

    if [ ! -d «$Archivo» ]; then
    echo «No existe $Archivo»
    echo «Creando -> «$Archivo»
    touch «$Archivo»
    else
    echo «El Archivo «$Archivo» ya existe
    fi

    1.    Katekyo dijo

      cuando hagas el mkdir fijate después si la terminal lo pudo crear porque puede romper las bolas si es una carpeta como root o de sistema hhah

  15.   Julio Vinachi dijo

    Saludos KZKG^Gaara una consulta como haria para usar curl . quisiera saber como hago desde consola que haga un ping a una url para ver si esta disponible por ejemplo http://portal.com/directorio/archivo1.php en donde el archivo1 me estara almacenando las ip de visitas es para el monitoreo de un equipo que necesito que haga ese pin cada media hora para que me tenga al tanto de la ip publica ya que cambia cada cierto tiempo y no me puedo conectar por ssh.

    Saludos gracias de antemano que Dios te bendiga.

    1.    KZKG^Gaara dijo

      Hola que tal,

      Primero, tienes que decir que la variable IP (por ejemplo) es el contenido de ese archivo, para ello hay que:
      1. Descargar el archivo
      2. Ver su contenido y sacar de ahí la IP
      3. Que esa IP sea la variable

      Por ejemplo:
      Aquí bajamos el archivo -» wget http://portal.com/directorio/archivo1.php -o file.html
      Luego asignamos a una variable su contenido: -» : ${IP:=`cat file.html`}
      .. suponiendo que el contenido de ese archivo solo tenga la IP, si no es así, habría que trabajar con grep, awk o head.

      Una vez tengas ya la IP como una variable, el resto es lo más simple del mundo 🙂

      Si quieres me escribes al email (kzkggaara[at]desdelinux[dot]net) que con gusto te ayudo

      1.    Julio Vinachi dijo

        Muchas gracias kzkggaara muy agradecido.

  16.   Natalia dijo

    Hola, no entiendo mucho sobre informática y tampoco sé si esta entrada va relacionada con el problema que tengo.

    Os comento por si me léeis, a pesar de que es de hace un año el post:
    Resulta que cree una carpeta en mi escritorio para almacenar unos vídeos. Bien, esos vídeos los borré porque ya no me hacían falta y ahora esta carpeta me dice que no existe (a pesar de que está en mi escritorio visible).

    – Ese es el primer problema que tengo:
    No puedo borrar la carpeta.

    – Segundo problema y creo que más importante:
    En un intento de borrar la carpeta, metí una carpeta de FOTOS. Ahora, cuando abro la carpeta que «no existe» está vacía y las FOTOS no están.

    ¿Cómo puedo recuperar las fotos? He dado a la opción dentro de la carpeta «Mostrar documentos ocultos» pero no aparecen la carpeta de las FOTOS.

    Espero que podáis saber cómo se soluciona.
    Gracias.

    1.    valdo dijo

      Hay dos usuarios que son los principales.: root y tu_usuario (natalia por ejemplo). Ambos tienen carpetas personales. tu_usuario en /home y root en / (directorio raíz). Haciendo click derecho sobre la carpeta fijate a quien pertenece. Si es a root con tu gestor de archivos utilizando sudo o gksu o kdesu dependiendo del entorno que uses ve al directorio raíz -> root -> Desktop y rpobablemente encuentres las fotos y puedas borrar la carpeta. Algunas distros cuando no eres el propietario del archivo o directorio y no tienes permisos de acceso te dicen directorio/archivo no existente. Si el propietario eres tú y no root haces lo mismo con el gestor de archivos con sudo, etc y vas al directorio raíz -> /home -> carpeta_personal -> Desktop y ves si allí están las fotos y si puedes borrar la carpeta.
      Si esto no funciona habrá que ver otras opciones desde el terminal (consola).

  17.   Pedro Manuel Aguayo Muñoz dijo

    Hola que tal, me encuentro realizando un trabajo en bash y quisiera saber como verificar si existe un directorio ingresado desde teclado, por ejemplo

    #!/bin/bash
    read ruta
    #Ingreso ~/Desktop
    #Luego trato de navegar por ese directorio
    cd $ruta
    #Me aparece el siguiente mensaje bash: cd: ~/Desktop: No existe el fichero o el directorio

    Mi pregunta es ¿Qué puedo hacer para que lo ingrese desde teclado me lo tome como una ruta de un directorio?

  18.   Miguel dijo

    Y como puedo saber si existe un grupo,

  19.   heidy dijo

    buenas tengo un problema en mi canaima cuando presiono el boton cunaguaro dice que no existe fichero o directorio como haria para resolver ese problema y del resto no me abre cunaguaro porfavor gracias.

  20.   Carlos dijo

    ¿Cómo se hace el if en BASH si el nombre del archivo tiene espacios?
    Por ejemplo:
    Datos mes de Abril.xlsx

    Para preguntar si existe el archivo

    1.    Manuel Alcocer Jiménez dijo

      Carlos, así:

      if [[ «$variable» == Datos\ mes\ de\ Abril.xlsx ]] ; then echo ‘coincide’ ; fi

      También puedes:
      if [[ «$variable» == ‘Datos mes de Abril.xlsx’ ]] ; then echo ‘coincide’ ; fi

      Otra opción:
      [[ «$variable» == ‘Datos mes de Abril.xlsx’ ]] && echo ‘coincide’ || echo ‘no coincide’

      En algunas zonas oscuras de internet recomiendan usar [[ ]] en vez de [ ], y si vas a comparar números entonces: (( variable >= 3 )) && echo ‘variable es mayor o igual que 3’ || echo ‘variable es menor que 3’

      Por tanto, para números:

      if (( numero != 4 )) ; then echo «${numero} no es 4» ; else echo «${numero} es 4» ; fi

  21.   Cesar Mateus dijo

    como se puede hacer un código para que valide si el directorio tiene un texto especifico, para poder editarlo.

    ejemplo:

    if (texto1)

    no hacer nada

    else

    cambiar texto1 por texto2

  22.   Miguel dijo

    una duda, como seria para que comprobara cada 15 segundos si existe el fichero o no, gracias.

  23.   riber dijo

    Hola,
    esto:
    if [ -w /home/Komun/Logs/ti ]; then
    averigua si el archivo es escribible. Pero se basa en los permisos de usuario. ¿Se puede hacer para saber si el grupo o los others tienen permisos?