如何使用 xargs 和gunzip 维护排序顺序

如何使用 xargs 和gunzip 维护排序顺序

我试图按字母顺序(在本例中也意味着日期和迭代)顺序提取一些文件的内容,当我首先使用以下命令测试该过程时ls

$ find /opt/minecraft/wonders/logs/ -name 20* -type f -mtime -3 -print0 \
   | sort | xargs -r0 ls -l | awk -F' ' '{print $6 " " $7 " " $9}'

我得到了一个积极的结果:

Aug 18 /opt/minecraft/wonders/logs/2018-08-17-3.log.gz
Aug 18 /opt/minecraft/wonders/logs/2018-08-18-1.log.gz
Aug 19 /opt/minecraft/wonders/logs/2018-08-18-2.log.gz
Aug 19 /opt/minecraft/wonders/logs/2018-08-19-1.log.gz
Aug 20 /opt/minecraft/wonders/logs/2018-08-19-2.log.gz
Aug 20 /opt/minecraft/wonders/logs/2018-08-20-1.log.gz

但是,当我实际提取文件时,排序顺序丢失了:

$ find /opt/minecraft/wonders/logs/ -name 20* -type f -mtime -3 -print0 \
   | sort | xargs -r0 gunzip -vc | grep "\/opt.*"`

/opt/minecraft/wonders/logs/2018-08-18-1.log.gz:     66.8%
/opt/minecraft/wonders/logs/2018-08-18-2.log.gz:     83.1%
/opt/minecraft/wonders/logs/2018-08-19-1.log.gz:     70.3%
/opt/minecraft/wonders/logs/2018-08-19-2.log.gz:     72.9%
/opt/minecraft/wonders/logs/2018-08-20-1.log.gz:     73.3%
/opt/minecraft/wonders/logs/2018-08-17-3.log.gz:     90.2%

解压缩这些文件时如何保持排序顺序?

答案1

您已经使用了-print0withfind-0with选项xargs,但忘记使用-zfor sort,因此sort基本上看到了一行(除非您的文件名包含\n)。您看到的输出ls可能ls正在进行一些排序。

find /opt/minecraft/wonders/logs/ -name '20*' -type f -mtime -3 -print0 |
  sort -z | xargs -r0 gunzip -vc | grep /opt

(注意:20*是一个 glob,需要为 shell 引用,因此它按字面意思传递给find,您不想转义/for grep,它的作用未指定,如果您想要的只是打印,则不需要.*在正则表达式的末尾匹配线)

相关内容