Сzsh
:
bydepth() REPLY=${REPLY//[^\/]}
cd Dropbox/**/*(D/O+bydepth[1])
Мы определяем bydepth
функцию сортировки, которая возвращает файл с удаленными символами, отличными от /
(, поэтому порядок после этого преобразования находится на глубине )и используем рекурсивную подстановку(**/
на любом уровне подкаталоги )с квалификаторами glob:
D
чтобы также учитывать скрытые каталоги /
только для каталогов O+bydepth
:обратная сортировка по глубине [1]
получить только первый (после сортировки ). С bash
и инструментами GNU эквивалент будет примерно таким:
IFS= read -rd '' deepest < <(find Dropbox/ -type d -print0 |
awk -v RS='\0' -v ORS='\0' -F / '
NF > max {max = NF; deepest = $0}
END {if (max) print deepest}') && cd -- "$deepest"
(в случае ничьей выбранный не обязательно будет таким же, как в zsh
подходе ).
С вашим новым дополнительным требованием все становится сложнее. По сути, если я правильно понимаю, в случае связей он должен измениться на каталог, который является самым глубоким общим родителем всех этих каталогов на максимальной глубине. Сzsh
:
cd_deepest() {
setopt localoptions rematchpcre
local REPLY dirs result dir match
dirs=(${1:-.}/**/*(ND/nOne:'
REPLY=${#REPLY//[^\/]}-$REPLY':))
(($#dirs)) || return
result=$dirs[1]
for dir ($dirs[2,-1]) {
[[ $result//$dir =~ '^([^-]*-.*)/.*//\1/' ]] || break
result=$match[1]
}
cd -- ${result#*-} && print -rD -- $PWD
}
Пример:
$ tree Dropbox
Dropbox
├── a
│ └── b
│ ├── 1
│ │ └── x
│ └── 2
│ └── x
└── c
└── d
└── e
9 directories, 0 files
$ cd_deepest Dropbox
~/Dropbox/a/b
(Dropbox/a/b/1/x
и Dropbox/a/b/2/x
— самые глубокие, и мы меняем их на самый глубокий общий родитель(Dropbox/a/b
)).