我在一个包含 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
. 执行时,cd
s 进入folder2
.
(文件夹按 排序ls -1
。我正在使用zsh
)
默认情况下,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
可能会出现问题的信息。