Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I check if certain files exist in Bash?

In a bash script, I have to check for the existence of several files.

I know an awkward way to do it, which is as follows, but that would mean that my main program has to be within that ugly nested structure:

if [ -f $FILE1 ]
then
if [ -f $FILE2 ]
then
  echo OK
  # MAIN PROGRAM HERE
fi
fi

The following version does not work:

([ -f $FILE1 ] && [ -f $FILE2 ]) ||  ( echo "NOT FOUND"; exit 1 )
echo OK

It prints

NOT FOUND
OK

Is there an elegant way to do this right?

UPDATE: See the accepted answer. In addition, in terms of elegance I like Jonathan Leffler's answer:

arg0=$(basename $0 .sh)
error()
{
    echo "$arg0: $@" 1>&2
    exit 1
}

[ -f $FILE2 ] || error "$FILE2 not found"
[ -f $FILE1 ] || error "$FILE1 not found"
like image 546
Frank Avatar asked Feb 21 '09 03:02

Frank


People also ask

How do I search for a file in bash?

You need to utilize the “-L” option and the path and “-name” option in your command. The “*” in the name specification is used for searching “all” the bash files with “.

How do you verify if a file exists in Linux?

When checking if a file exists, the most commonly used FILE operators are -e and -f . The first one will check whether a file exists regardless of the type, while the second one will return true only if the FILE is a regular file (not a directory or a device).

How do you check file is exists or not in shell script?

While checking if a file exists, the most commonly used file operators are -e and -f. The '-e' option is used to check whether a file exists regardless of the type, while the '-f' option is used to return true value only if the file is a regular file (not a directory or a device).


2 Answers

How about

if [[ ! ( -f $FILE1 && -f $FILE2 ) ]]; then
    echo NOT FOUND
    exit 1
fi

# do stuff
echo OK

See help [[ and help test for the options usable with the [[ style tests. Also read this faq entry.

Your version does not work because (...) spawns a new sub-shell, in which the exit is executed. It therefor only affects that subshell, but not the executing script.

The following works instead, executing the commands between {...} in the current shell.

I should also note that you have to quote both variables to ensure there is no unwanted expansion or word splitting made (they have to be passed as one argument to [).

[ -f "$FILE1" ] && [ -f "$FILE2" ] || { echo "NOT FOUND"; exit 1; }
like image 183
Johannes Schaub - litb Avatar answered Oct 21 '22 07:10

Johannes Schaub - litb


I think you're looking for:

if [ -f $FILE1 -a -f $FILE2 ]; then
    echo OK
fi

See man test for more details on what you can put inside the [ ].

like image 28
Greg Hewgill Avatar answered Oct 21 '22 07:10

Greg Hewgill