我有一个包含大约 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 的顺序相同?
答案1
ls
shell globs 默认按名称按词法对文件列表进行排序。
GNU 实现ls
有一个-v
选项版本sort 在这里会对您有所帮助,但是ls
在 macos 中没有等效项(它-v
用于其他内容(逐字))。
GNU 实现也sort
有一个-V
选项版本种类。 macossort
确实复制了那个(BSDsort
曾经是 GNU sort
,所以重写了它们的人保留了 API)。
因此,如果当前工作目录中的所有文件名都没有换行符。
ls | sort -V
会给你一个数字顺序。
在 zsh shell 中,该numericglobsort
选项(使用 启用set -o numericglobsort
)可用于默认情况下按数字排序的 glob 扩展,或者您可以使用n
glob 限定符在每个 glob 的基础上选择该顺序:
print -rC1 -- *.jpg(Nn)
(这里还使用N
ullglob 限定符,如果没有匹配则不会抱怨)将print
r
aw on 1
C
olumn 名称以 结尾的非隐藏文件.jpg
,按数字排序。
不过,要获取 csv 格式的列表,您需要类似以下内容:
(){ print -rC1 -- \"${^argv//\"/\"\"}\"; } *.jpg(Nn)
也就是说,将文件名用引号引起来,并将"
文件名中的 s 转义为""
.