Linux程序“排序”可以对文件进行排序,或者对另一个程序的输出进行排序。如何使用排序按文件名、文件名、文件大小对ls命令的输出进行排序。
我知道“ls”命令有一些选项可以这样做,但我尝试使用“ls”命令来显示大小,使用“排序”命令来控制排序,然后使用管道进行组合。
我怎样才能做到这一点?
发布于 2022-01-26 10:52:57
类Unix系统上的文件名是除0以外的一个或多个字节(通常不超过某个限制)和编码/的字节序列。
sort对行进行排序,即根据命令行上给出的排序键规范,对0或更多的数组(不超过某些实现的限制)字符和换行符(以及带有某些实现的NUL )进行排序。
sort的GNU实现(及其克隆)可以将输入上的NUL作为标准的扩展处理,也可以对以NUL分隔的记录进行排序,而不是行(使用-z选项)。
如果将区域设置为C (实际上,如果禁用本地化),则可以进行字节D4字符映射。
例如,ls的自动打开实现可以使您接近:
ls --format='%(size)d\t%(name)s'但是,这是换行符分隔的记录,而不是以NUL分隔的记录,因此不能工作,因为换行符和文件名中的任何字符一样有效。
您不能在那里使用\0来获得NUL,但是您可以做到:
ls --format='%(size)d\t%(name)s/'在GNU awk的帮助下,您可以将这些/分隔符转换为GNU sort -z的NUL分隔符:
ls --format='%(size)d\t%(name)s' |
LC_ALL=C gawk -v 'RS=/\n' -v 'ORS=\0' 1 |
LC_ALL=C sort -zn |
LC_ALL=C tr '\0' '\n'( tr最终仅供显示)。
使用GNU ls,您不能像ast那样格式化输出(find或stat是在GNU工具箱中这样做的),但是从9.0版开始,您可以使用--zero选项输出以NUL分隔的记录。
通过以下方式:
LC_ALL=C ls -go --zero您得到的输出如下:
所以你可以从中提取出大小和名字。
但这并不适用于所有类型的文件。
->,设备编号。GNU ls还有一个--dired选项,它给出了一个用于emacs的输出,并提供了关于每个文件名在输出中的起始和结束位置的信息。这将有助于符号链接,但对设备文件没有帮助,您需要额外的工作才能使用//DIRED//偏移量来增加信息,并以适合排序的格式重新格式化信息。
ls的输出并不意味着要进行后处理。
相反,您可以使用:
zsh球体find及其-printf谓词stat (不兼容的API)stat()/lstat()/statx()...。API和内置的分类设施。https://unix.stackexchange.com/questions/687901
复制相似问题