Ще більш загальна версія, яка дозволяє використовувати 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
яка не встановлена за замовчуванням у більшість платформ.