我有一堆从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 个字符开始到最后一个字符。