Shell
如何 cd 到上一個/下一個同級目錄?
我經常有這樣的項目目錄佈局
project `-- component-a | `-- files... `-- component-b | `-- files... `-- component-c `-- files...
我通常會在其中一個
component
目錄中工作,因為那是文件所在的位置。然後當我返回到 shell 時,我通常只需要移動到同級目錄,尤其是當我需要對每個組件進行一些非腳本更改時。在這些情況下,我什至不會關心我要處理的上一個同級目錄或下一個同級目錄。我可以定義一個命令,
prev
或者next
將cd
我簡單地放入上一個目錄或下一個目錄(按字母表或其他)?因為一直打字cd ../com<TAB><Arrow keys>
有點老了。
不要使用其他答案中的 commandlinefu 解決方案:它不安全¹且效率低下。²相反,如果您正在使用
bash
,只需使用以下功能。為了使它們持久化,請將它們放入您的.bashrc
. 請注意,我使用 glob 順序,因為它是內置的且簡單。不過,在大多數語言環境中,通常 glob 順序*是按字母順序排列的。*如果沒有下一個或上一個目錄可以訪問,您將收到一條錯誤消息。特別是,如果您嘗試next
或prev
在根目錄中時,您將看到錯誤/
。## bash and zsh only! # functions to cd to the next or previous sibling directory, in glob order prev () { # default to current directory if no previous local prevdir="./" local cwd=${PWD##*/} if [[ -z $cwd ]]; then # $PWD must be / echo 'No previous directory.' >&2 return 1 fi for x in ../*/; do if [[ ${x#../} == ${cwd}/ ]]; then # found cwd if [[ $prevdir == ./ ]]; then echo 'No previous directory.' >&2 return 1 fi cd "$prevdir" return fi if [[ -d $x ]]; then prevdir=$x fi done # Should never get here. echo 'Directory not changed.' >&2 return 1 } next () { local foundcwd= local cwd=${PWD##*/} if [[ -z $cwd ]]; then # $PWD must be / echo 'No next directory.' >&2 return 1 fi for x in ../*/; do if [[ -n $foundcwd ]]; then if [[ -d $x ]]; then cd "$x" return fi elif [[ ${x#../} == ${cwd}/ ]]; then foundcwd=1 fi done echo 'No next directory.' >&2 return 1 }
¹它不處理所有可能的目錄名稱。 解析
ls
輸出從來都不是安全的。²
cd
可能不需要非常高效,但是 6 個程序有點過多。