切换到第x个目录终端

切换到第x个目录终端

在 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
哪个 #?:

相关内容