是否有一个终端命令可以导航到目录中最深的子目录?

K S*_*t X 6 scripting terminal

我的意思是,假设我们有以下目录

Dropbox(文件夹)

---> 鲍勃(文件夹)

-------> 2017(文件夹)

------------> 图像(文件夹)

----------------> image.png(文件)

我可以做到 cd Dropbox,但随后我必须手动导航到最深的目录images

有这样的命令 cd Dropbox:deepest directory会带我去Dropbox/Bob/2017/images吗?

如果在任何级别有平局,则在该级别停止

Sté*_*las 7

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/xDropbox/a/b/2/x是最深的,我们更改为它们最深的公共父级(Dropbox/a/b))。