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

Reply via email to