在unix shell(特別是Ubuntu)中是否有一種方法可以將目錄更改為從ls命令列印的xth目錄?我知道您可以透過多種方式對目錄進行排序,但是使用 ls 的輸出來獲取第 x 個目錄?
一個外殼範例:
$ ls
$ first_dir second_dir third_really_long_and_complex_dir
我想透過傳遞 3 (或正確數組格式的 2)進入third_really_long_and_complex_dir。我知道我可以簡單地複製和貼上,但如果我已經使用鍵盤,如果我知道索引,那麼輸入「cdls 2」或類似的內容會更容易。
更新
對於仍然看到這一點的人,當我對 linux/bash 非常陌生並且沒有意識到存在製表符完成這樣的事情時,我創建了這個問題。
答案1
互動式會話中的主要問題cd
是您通常想要更改正在處理命令提示字元的 shell 的目前目錄。這意味著啟動子 shell(例如腳本)不會有幫助,因為任何cd
呼叫都不會影響父 shell。
但是,根據您使用的 shell,您也許可以定義一個功能去做這個。例如在 bash 中:
function cdls() {
# Save the current state of the nullglob option
SHOPT=`shopt -p nullglob`
# Make sure that */ expands to nothing when no directories are present
shopt -s nullglob
# Get a list of directories
DIRS=(*/)
# Restore the nullblob option state
$SHOPT
# cd using a zero-based index
cd "${DIRS[$1]}"
}
請注意,在這個範例中,我絕對拒絕解析 的輸出ls
,由於多種原因。相反,我讓 shell 本身檢索目錄列表(或目錄連結)...
也就是說,我懷疑使用這個函數(或任何具有此效果的函數)是一個非常好的方法,可以讓自己陷入巨大的混亂 - 就像rm
在更改到錯誤的目錄後使用一樣。檔案名稱自動完成已經夠危險的了,不用強迫自己數數…
答案2
我有一個函數:
函數 cdi. { IFS=$'\n' 頁=${1:-1} LPP=${2:-11} 首先=$(( 1 + LPP * 頁 - LPP )) 最後=$((LPP * 頁)) 在 $(find . -maxdepth 1 -type d -printf "%P\n" |\ 中選擇 cd_into sed -n $first,${last}p); 做 退出=-1; 如果 [[ $REPLY == n ]];然後讓 PAGE=PAGE+1; cdi。 $頁$LPP;退出=$? elif [[ $REPLY == p ]];然後讓 PAGE=PAGE-1; cdi。 $頁$LPP;退出=$? elif [[ $REPLY == m ]];則令LPP=LPP*2; cdi。 $頁$LPP;退出=$? elif [[ $REPLY == l ]];則令LPP=LPP/2; cdi。 $頁$LPP;退出=$? elif [[ $REPLY == q || $REPLY == 0]];然後回傳0;菲 如果 [ $EXIT -eq 0 ];然後返回0;菲 cd_into=${cd_into//\~/$HOME} 如果 [ -d "$cd_into" ];那麼 cd“$cd_into”;返回0;別的 echo "哎呀!\`$cd_into'不是一個資料夾(?)" 菲 完畢 未設定 IFS }
使用方法:
$cdi。 1) .mozilla.new 3) .swt 5) tmp 7) .vim 9) .ssh 2) .crack-attack 4) 下載 6) .Eterm 8) .frozen-bubble 10) .irssi 哪個 #?