ディレクトリの最も深いサブディレクトリに移動するターミナルコマンドはありますか?

ディレクトリの最も深いサブディレクトリに移動するターミナルコマンドはありますか?

私は、次のディレクトリがあるとしましょう。

Dropbox(フォルダ)

--->ご飯(フォルダ)

--------> 2017(フォルダ)

------------>画像(フォルダ)

---> image.png (ファイル)

これは可能ですが、 cd Dropbox最も深いディレクトリに手動で移動する必要がありますimages

cd Dropbox:deepest directory私をそこに連れて行くためのそのような命令がありますか Dropbox/Bob/2017/images

あるレベルでタイがあればそのレベルで停止

ベストアンサー1

そしてzsh

bydepth() REPLY=${REPLY//[^\/]}
cd Dropbox/**/*(D/O+bydepth[1])

bydepth削除されていない文字を含むファイルを返すソート関数を定義します/(したがって、変換された順序は深くなります)。**/glob修飾子で再帰的globbingを使用します(サブディレクトリのすべてのレベル)。

  • Dまた、ディレクトリを隠すことも検討してください。
  • /ディレクトリにのみ適用
  • O+bydepth:深さに応じて逆順に並べ替え
  • [1](ソート後)最初の項目のみを取得します。

GNUツールを使用すると、bashこれは次のようになります。

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

おすすめ記事