列出按数字排序的文件

列出按数字排序的文件

我有一堆从log1到 的文件log164

我试图在 UNIX 终端中列出目录(已排序),但排序函数仅提供如下格式:

home:logs Home$ ls -1 | sort
log1.gz
log10.gz
log100.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz
...etc

我想要的是

home:logs Home$ ls -1 | sort
log1.gz
log2.gz
log3.gz
log4.gz
log5.gz
log6.gz
log7.gz
...{more here}
log99.gz
log100.gz
log101.gz
log102.gz
...etc

我可以用什么来做到这一点有什么建议吗?

答案1

ls为什么不针对这种特殊情况使用内置的 GNU功能:

-v— 文本中(版本)数字的自然排序

例如:

ls -1v log*

答案2

使用 GNU ls(即在 Linux、Cygwin 或专门安装了 GNU ls 的其他系统上):

ls -v

在 zsh 中:

echo *(n)

在其他外壳中:

echo log?.gz log??.gz log???.gz

如果您希望每个文件名位于单独的行,请替换echo为。printf '%s\n'

如果您还需要文件元数据 ( ls -l) 并且没有 GNU ls,则需要ls分别调用您想要按字典顺序查看的每个文件名或文件名组。

ls -ld log?.gz; ls -ld log??.gz; ls -ld log???.gz

为了避免这些困难,请在文件名中使用足够的前导零,以便字典排序更加人性化(log001.gz等)。

答案3

bash的大括号 ,{}将按顺序枚举它们:

for file in log{1..164}.gz; do
    process "$file"
done

答案4

虽然在这种特殊情况下,解决方案ls -1v无疑是最好的,但我认为最好也有一个sort与原始问题中一样有效的解决方案,因为当您的输入不是来自时,它也有效ls。在这种情况下,您可以使用:

ls -1 | sort -n -k1.4

-n选项告诉 sort 按数字排序,并将-k 1.4排序键设置为第一个字段(在本例中是整个文件名),从第 4 个字符开始到最后一个字符。

相关内容