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转义为"".