我在一个包含 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)
默认情况下,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可能会出现问题的信息。