Shell

如何 cd 到上一個/下一個同級目錄?

  • April 18, 2014

我經常有這樣的項目目錄佈局

project
`-- component-a
|   `-- files...
`-- component-b
|   `-- files...
`-- component-c
   `-- files...

我通常會在其中一個component目錄中工作,因為那是文件所在的位置。然後當我返回到 shell 時,我通常只需要移動到同級目錄,尤其是當我需要對每個組件進行一些非腳本更改時。在這些情況下,我什至不會關心我要處理的上一個同級目錄或下一個同級目錄。

我可以定義一個命令,prev或者nextcd我簡單地放入上一個目錄或下一個目錄(按字母表或其他)?因為一直打字cd ../com<TAB><Arrow keys>有點老了。

不要使用其他答案中的 commandlinefu 解決方案:它不安全¹且效率低下。²相反,如果您正在使用bash,只需使用以下功能。為了使它們持久化,請將它們放入您的.bashrc. 請注意,我使用 glob 順序,因為它是內置的且簡單。不過,在大多數語言環境中,通常 glob 順序*是按字母順序排列的。*如果沒有下一個或上一個目錄可以訪問,您將收到一條錯誤消息。特別是,如果您嘗試nextprev在根目錄中時,您將看到錯誤/

## 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 個程序有點過多。

引用自:https://unix.stackexchange.com/questions/41214