com zsh
:
bydepth() REPLY=${REPLY//[^\/]}
cd Dropbox/**/*(D/O+bydepth[1])
Definimos uma função de classificação bydepth
que retorna o arquivo com os caracteres diferentes de /
removido (para que a ordem após essa transformação esteja em profundidade) e use globalização recursiva ( **/
sendo qualquer nível de subdiretórios) com qualificadores glob:
-
D
também considera diretivas ocultas -
/
apenas para dirs -
O+bydepth
: inverter ordenar por profundidade -
[1]
obtém apenas o primeiro (após a classificação).
Com as ferramentas bash
e GNU, o equivalente seria algo como:
IFS= read -rd '' deepest < <(find Dropbox/ -type d -print0 |
awk -v RS='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 =~ '^([^-]*-.*)/.*///' ]] || break
result=$match[1]
}
cd -- ${result#*-} && print -rD -- $PWD
}
' -v ORS='$ tree Dropbox
Dropbox
├── a
│ └── b
│ ├── 1
│ │ └── x
│ └── 2
│ └── x
└── c
└── d
└── e
9 directories, 0 files
$ cd_deepest Dropbox
~/Dropbox/a/b
' -F / '
NF > max {max = NF; deepest = $0}
END {if (max) print deepest}') && cd -- "$deepest"
(no caso de empates, o escolhido não será necessariamente o mesmo que na abordagem zsh
).
Com o seu novo requisito extra, torna-se mais complicado. Basicamente, se eu entendi corretamente, no caso de empates, ele deve mudar para o diretório que é o pai comum mais profundo de todos esses diretórios na profundidade máxima. Com zsh
:
bydepth() REPLY=${REPLY//[^\/]}
cd Dropbox/**/*(D/O+bydepth[1])
Exemplo:
IFS= read -rd '' deepest < <(find Dropbox/ -type d -print0 |
awk -v RS='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 =~ '^([^-]*-.*)/.*///' ]] || break
result=$match[1]
}
cd -- ${result#*-} && print -rD -- $PWD
}
' -v ORS='$ tree Dropbox
Dropbox
├── a
│ └── b
│ ├── 1
│ │ └── x
│ └── 2
│ └── x
└── c
└── d
└── e
9 directories, 0 files
$ cd_deepest Dropbox
~/Dropbox/a/b
' -F / '
NF > max {max = NF; deepest = $0}
END {if (max) print deepest}') && cd -- "$deepest"
( Dropbox/a/b/1/x
e Dropbox/a/b/2/x
são os mais profundos e mudamos para o pai mais comum ( Dropbox/a/b
)).