Еще более общая версия, которая позволяет использовать 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
которая по умолчанию не установлена в большинство платформ.