在 unix shell(特别是 Ubuntu)中是否有办法将目录更改为从 ls 命令打印的第 x 个目录?我知道您可以用多种方式对目录进行排序,但是使用 ls 的输出来获取第 x 个目录?
示例 shell:
$ 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 * PAGE - LPP )) 最后=$(( LPP * PAGE )) 在 $(find . -maxdepth 1 -type d -printf "%P\n" |\ 中选择 cd_into sed -n $first,${last}p); 做 退出=-1; 如果 [[ $REPLY == n ]]; 则让 PAGE=PAGE+1; cdi.$PAGE $LPP ; EXIT=$? elif [[ $REPLY == p ]]; 然后让 PAGE=PAGE-1; cdi.$PAGE $LPP ; EXIT=$? elif [[ $REPLY == m ]]; 然后让 LPP=LPP*2; cdi。$PAGE $LPP ; EXIT=$? elif [[ $REPLY == l ]]; 然后让 LPP=LPP/2; cdi。$PAGE $LPP ; EXIT=$? elif [[ $REPLY == q || $REPLY == 0 ]];然后返回 0; fi 如果 [ $EXIT -eq 0 ]; 则返回 0; fi 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 哪个 #?: