按照与 Finder 中相同的顺序获取终端中的文件列表

bro*_*zai 4 shell zsh terminal macos

我有一个包含大约 1,000 个图像文件的文件夹。我需要创建一个它们的列表。我在某个地方看到,如果我进入终端并 cd 进入文件夹,我所要做的就是输入

ls > 列表.csv

生成一个列表。问题是,此列表与我在 Finder 中看到的文件的顺序不同。例如,在 Finder 中,第一张图像是 16_left.jpg。然而,生成的 list.csv 文件中的第一张图像是 10017_left.jpg,而 16_left.jpg 一直紧贴在 15975_right.jpg 和 16007_right.jpg 之间。

我可以看到,在 Finder 中,它认为数字 16 是文件中最小的数字,并将其放在顶部,而 list.csv 文件不是按整个数字本身,而是按从左到右的每个数字对列表进行排序。

如何使 list.csv 与 Finder 的顺序相同?

Sté*_*las 11

lsshell globs 默认按名称按词法对文件列表进行排序。

GNU 实现ls有一个版本-v排序选项,这将在此处帮助您,但在 macos 中没有等效项(它用于其他内容(逐字))。ls-v

GNU 实现也sort有一个版本排序选项。macos确实复制了那个(BSD曾经是 GNU ,所以重写了它们的人保留了 API)。-Vsortsortsort

因此,如果当前工作目录中的所有文件名都没有换行符。

ls | sort -V
Run Code Online (Sandbox Code Playgroud)

会给你一个数字顺序。

在 zsh shell 中,该numericglobsort选项(使用 启用set -o numericglobsort)可用于默认情况下按数字排序的 glob 扩展,或者您可以使用nglob 限定符在每个 glob 的基础上选择该顺序:

print -rC1 -- *.jpg(Nn)
Run Code Online (Sandbox Code Playgroud)

(这里还使用Nullglob 限定符,如果没有匹配则不会抱怨)将print raw on 1 Column 名称以 结尾的非隐藏文件.jpg,按数字排序。

不过,要获取 csv 格式的列表,您需要类似以下内容:

(){ print -rC1 -- \"${^argv//\"/\"\"}\"; } *.jpg(Nn)
Run Code Online (Sandbox Code Playgroud)

也就是说,将文件名括在引号中,并将"文件名中的 s转义为"".