`cd` 的快捷方式进入目录中的第二个文件夹

Con*_*ett 0 zsh cd-command

语境

我在一个包含 3 个文件夹的目录中。执行后,ls -1它们的顺序如下:

folder1
folder2
folder3
Run Code Online (Sandbox Code Playgroud)

我想快点cd进去folder2

我能够写一个函数来快速cd进入folder1

这是我的功能。

f1 () {
       cd $(ls -d */|head -n 1)
}
Run Code Online (Sandbox Code Playgroud)

我需要一个名为f2. 执行时,cds 进入folder2.


(文件夹按 排序ls -1。我正在使用zsh

ilk*_*chu 5

默认情况下,Shell glob 是按字典顺序排列的,Zsh 允许直接索引 glob 的结果,因此您可以执行以下操作:

cd2() {
    cd -- */([2]);       # indexing starts at one
}
Run Code Online (Sandbox Code Playgroud)

在 Bash 中,您可以对数组执行相同操作:

cd2() {
    local dirs=(*/)
    cd -- "${dirs[1]}"   # indexing starts at zero
}
Run Code Online (Sandbox Code Playgroud)

两者基本上都假设至少有两个匹配到 glob。有关处理该假设的方法,请参阅Kusalananda 的回答

此外,如果您使用ls别名以便为其提供一些标志,则排序顺序可能与 shell 的排序顺序不同。(我在 Linux 上使用了ls别名ls -vF --color=auto-v甚至更改了a和的排序顺序_。)Zsh 当然也会为您提供多种其他排序选项。


请注意,虽然您可以使用类似的ls | head -2 | tail -1方法获取ls输出列表中的第二个文件名,但这不适用于带换行符的文件名,并且涉及的不是一个而是三个外部进程来执行 shell 能够自行执行的操作,因此它不是一个很好的解决方案。ls */甚至更愚蠢,因为这里是扩展 glob的外壳,并且ls只打印出它收到的名称。请参阅https://mywiki.wooledge.org/ParsingLs,了解更多关于依赖 的输出ls可能会出现问题的信息。