I have a simple script to check a file of today's date. In the below example, the else condition is ignored if the file is not found. Why so?
if filedir=$(find . -type f -name "*.sql.gz" -mtime -1 -printf "%f\n"); then
echo $filedir
else
echo "oops"
fi
CodePudding user response:
find returns an exit-code of 0 if all arguments are processed successfully, and has only a non-zero exitcode if there was an error. The exit code for find does not indicate whether or not files are found.
This is unlike, for example grep. You can see the difference in behaviour when you use
if filedir=$(find . -type f -name "*.sql.gz" -mtime -1 -printf "%f\n" | grep '.'); then
CodePudding user response:
As Ljm Dullaart explained earlier, the find command does not return a specific code, when no file match patterns or rules.
Though, You may test it found a match, by checking the variable filedir is not empty:
[ -n "${filedir}" ]
if filedir="$(find . -type f -name '*.sql.gz' -mtime -1 -printf '%f\n')" && [ -n "${filedir}" ]; then
printf 'Found: %s\n' "${filedir}"
else
printf 'Oops! Found no file matching *.sql.gz!\n' >&2
fi
