终端:SORT 命令;如何正确排序?

Terminal: SORT command; how to sort correctly?

我写了一个shell脚本,可以从一个文件夹及其所有子文件夹中获取所有文件名,并在排序后将它们复制到剪贴板(删除所有路径;我只需要一个简单的其中数千个随机命名文件的文件列表)。

我想不通的是如何让 SORT 命令正确排序。意思是,电子表格对事物进行排序的方式。或者你的 Mac 查找器排序东西的方式。

下划线 > 数字 > 字母(不区分大小写)

有人知道怎么做吗? Sort -n 只适用于以数字开头的文件,sort -f 很接近但以一种奇怪的方式分隔小写和大写,任何以数字开头的东西都到处都是。 Sort -V 是最接近的,但任何以下划线开头的东西都到了底部而不是顶部……我快要疯了。

我已经尝试解决这个问题一个星期了,但我尝试过的任何组合都无法使排序命令正确排序。

帮忙?

您似乎想 sort 字典顺序 折叠 大小写,所以它是 sort -df.

如果我对问题的理解正确,您需要 Natural sort order - Wikipedia, Sorting for Humans : Natural Sort Order, and macos - How does finder sort folders when they contain digits and characters? 中描述的“自然排序顺序”。

使用 Linux sort(1) 您需要 -V (--version-sort) 选项进行“自然”排序。您还需要 -f (--ignore-case) 选项来忽略字母的大小写。因此,假设文件名存储 one-per-line 在一个名为 files.txt 的文件中,您可以生成一个列表(大部分)以您想要的方式排序:

sort -Vf files.txt

但是,sort -Vf 在我的系统上将下划线排在数字和字母之后。我试过使用不同的语言环境(参见 How to set locale in the current terminal's session?),但没有成功。我看不到使用 sort 选项更改它的方法(但我可能遗漏了一些东西)。

字符 .~ 似乎始终排在带有 sort -V 的数字和字母之前。解决该问题的一种可能的破解方法是将下划线与其中一个交换,排序,然后再次交换。例如:

tr '_~' '~_' <files.txt | LC_ALL=C sort -Vf |  tr '_~' '~_'

似乎可以在我的系统上执行您想要的操作。我已经用 LC_ALL=C ... 明确地为 sort 命令设置了语言环境,因此它在其他系统上的行为应该相同。 (参见 Why doesn't sort sort the same on every machine?。)