Ще більш загальна версія, яка дозволяє використовувати findпараметри:
#!/bin/bash
set -e
path="$1"
shift 1
while [[ $path != / ]];
do
find "$path" -maxdepth 1 -mindepth 1 "$@"
# Note: if you want to ignore symlinks, use "$(realpath -s "$path"/..)"
path="$(readlink -f "$path"/..)"
done
Наприклад (якщо припустимо, що сценарій збережено як find_up.sh)
find_up.sh some_dir -iname "foo*bar" -execdir pwd \;
... надрукує імена всіх some_dirпредків Росії (включаючи себе), до /яких знайдеться файл із шаблоном.
При використанні readlink -fвищевказаного сценарію будуть слідувати посилання на шляху вгору, як зазначено в коментарях. Ви можете використовувати realpath -sнатомість, якщо ви хочете слідувати шляхами вгору по імені ("/ foo / bar" підніметься до "foo", навіть якщо "bar" є символьним посиланням) - однак для цього потрібна установка, realpathяка не встановлена за замовчуванням у більшість платформ.