Эта функция bash выполняет перебор -принудительно find
по всем уровням каталогов под текущим каталогом в поисках именованного каталога.
cdd() {
if [ "$#" -ne 1 ]
then
printf '%s: Error: one directory name expected\n' "${FUNCNAME[0]}" >&2
return
fi
maxdepth=$(find. -type d -exec sh -c 'printf %s "$1" | LC_ALL=C tr -dc / | wc -c' findshell {} \; | sort -n | tail -1)
for((i=1; i <= maxdepth; i++))
do
dir=$(find. -mindepth "$i" -maxdepth "$i" -type d -name "$1")
if [ -n "$dir" ]
then
command cd -- "$dir"
return
fi
done
printf '%s: %s: no such directory found\n' "${FUNCNAME[0]}" "$1" >&2
}
Первая команда find
выполняет фрагмент оболочки для каждого каталога в текущем каталоге; фрагмент оболочки выводит имя каталога в конвейер tr
и wc
, который удаляет каждый символ, не являющийся косой чертой -, а затем подсчитывает количество косых черт -. Я перенял этот трюк у ilkkachu и Stéphane Chazelas здесь . После вывода всех глубин каталога мы sort | tail
находим наибольшее число. Это число является максимальной глубиной каталога, в которой нам нужно искать.
После этого выполняется цикл по find
, ограниченный точно каждой глубиной каталога по очереди, начиная с текущего каталога до самого глубокого каталога. Если совпадение найдено, мы cd
и выходим из функции. Если совпадений не найдено, мы выходим из цикла и выводим сообщение в stderr.