On 2020-04-10 16:09, Peng Yu wrote: > Hi, > > I'd like to look for a file by its name in the current directory. If > not found, go the the parent and look for it again. If not go up one > level again and look for it, ... until it is found (or until a given > level is reached). If the file is not found, return an error. > > The resulted path should be relative to the original current directory. > > Is there a way to do this easily with find? Thanks.
Hi Peng, I'm afraid find(1) is only searching "down" the current hierarchy, but not "up" until "/". However once would involve find(1) here, it would just be degraded to testing whether the file exist. Instead, I'd go with a shell script like this: ---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<--- #!/bin/sh f="$1" \ && test -n "$f" \ || { echo "Usage: $0 FILE" >&2; exit 1; } p="." # Search until the parent is identical to the current directory (='/'). until [ "$p" -ef "$p/.." ]; do if [ -e "$p/$f" ]; then echo "$p/$f" exit 0 fi p="$p/.." done # Now we're in the '/' dir; check once again. if [ -e "$p/$f" ]; then echo "$p/$f" exit 0 fi echo "'$f' not found" >&2 exit 1 --->8--->8--->8--->8--->8--->8--->8--->8--->8--->8--->8--- Have a nice day, Berny