While loop to test if a file exists in bash

前端 未结 8 539
旧巷少年郎
旧巷少年郎 2020-12-23 10:37

I\'m working on a shell script that does certain changes on a txt file only if it does exist, however this test loop doesn\'t work, I wonder why? Thank you!



        
相关标签:
8条回答
  • 2020-12-23 11:18

    works with bash and sh both:

    touch /tmp/testfile
    sleep 10 && rm /tmp/testfile &
    until ! [ -f /tmp/testfile ]
    do
       echo "testfile still exist..."
       sleep 1
    done
    echo "now testfile is deleted.."
    
    0 讨论(0)
  • 2020-12-23 11:22

    When you say "doesn't work", how do you know it doesn't work?

    You might try to figure out if the file actually exists by adding:

    while [ ! -f /tmp/list.txt ]
    do
      sleep 2 # or less like 0.2
    done
    ls -l /tmp/list.txt
    

    You might also make sure that you're using a Bash (or related) shell by typing 'echo $SHELL'. I think that CSH and TCSH use a slightly different semantic for this loop.

    0 讨论(0)
  • 2020-12-23 11:23

    Here is a version with a timeout so that after an amount of time the loop ends with an error:

    # After 60 seconds the loop will exit
    timeout=60
    
    while [ ! -f /tmp/list.txt ];
    do
      # When the timeout is equal to zero, show an error and leave the loop.
      if [ "$timeout" == 0 ]; then
        echo "ERROR: Timeout while waiting for the file /tmp/list.txt."
        exit 1
      fi
    
      sleep 1
    
      # Decrease the timeout of one
      ((timeout--))
    done
    
    0 讨论(0)
  • 2020-12-23 11:25

    If you are on linux and have inotify-tools installed, you can do this:

    file=/tmp/list.txt
    while [ ! -f "$file" ]
    do
        inotifywait -qqt 2 -e create -e moved_to "$(dirname $file)"
    done
    

    This reduces the delay introduced by sleep while still polling every "x" seconds. You can add more events if you anticipate that they are needed.

    0 讨论(0)
  • 2020-12-23 11:28

    I ran into a similar issue and it lead me here so I just wanted to leave my solution for anyone who experiences the same.

    I found that if I ran cat /tmp/list.txt the file would be empty, even though I was certain that there were contents being placed immediately in the file. Turns out if I put a sleep 1; just before the cat /tmp/list.txt it worked as expected. There must have been a delay between the time the file was created and the time it was written, or something along those lines.

    My final code:

    while [ ! -f /tmp/list.txt ];
    do
        sleep 1;
    done;
    sleep 1;
    cat /tmp/list.txt;
    

    Hope this helps save someone a frustrating half hour!

    0 讨论(0)
  • 2020-12-23 11:32

    do it like this

    while true
    do
      [ -f /tmp/list.txt ] && break
      sleep 2
    done
    ls -l /tmp/list.txt
    
    0 讨论(0)
提交回复
热议问题