K S*_*t X 6 scripting terminal
我的意思是,假设我们有以下目录
Dropbox(文件夹)
---> 鲍勃(文件夹)
-------> 2017(文件夹)
------------> 图像(文件夹)
----------------> image.png(文件)
我可以做到
cd Dropbox,但随后我必须手动导航到最深的目录images。
有这样的命令
cd Dropbox:deepest directory会带我去Dropbox/Bob/2017/images吗?
如果在任何级别有平局,则在该级别停止
与zsh:
bydepth() REPLY=${REPLY//[^\/]}
cd Dropbox/**/*(D/O+bydepth[1])
Run Code Online (Sandbox Code Playgroud)
我们定义了一个bydepth排序函数,该函数返回包含除/已删除之外的字符的文件(因此转换后的顺序是深度上的),并使用**/带有 glob 限定符的递归通配符(是任何级别的子目录):
D 还要考虑隐藏的目录/ 仅用于目录O+bydepth: 按深度反向排序[1] 仅获取第一个(排序后)。使用bashGNU 工具,相当于:
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"
Run Code Online (Sandbox Code Playgroud)
(在平局的情况下,所选择的不一定与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
}
Run Code Online (Sandbox Code Playgroud)
例子:
$ tree Dropbox
Dropbox
??? a
? ??? b
? ??? 1
? ? ??? x
? ??? 2
? ??? x
??? c
??? d
??? e
9 directories, 0 files
$ cd_deepest Dropbox
~/Dropbox/a/b
Run Code Online (Sandbox Code Playgroud)
(Dropbox/a/b/1/x和Dropbox/a/b/2/x是最深的,我们更改为它们最深的公共父级(Dropbox/a/b))。