私は、次のディレクトリがあるとしましょう。
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