【问题标题】:Find specific files containing patterns and gzip them查找包含模式的特定文件并将其压缩
【发布时间】:2022-01-11 18:45:45
【问题描述】:

我有一个类似结构的日志文件列表,例如:test.2020-10-17.log 我想在 2020 年 1 月到 9 月之间压缩所有文件。 我设法用 find 列出它们,但我也想 gzip 压缩它们。

这里是我当前命令的输出:https://i.stack.imgur.com/AznpY.png

【问题讨论】:

  • 您说“1 月到 9 月之间”,但您的代码表明您也想要 10 月。
  • 请不要在图片中显示文字。它们不可搜索,不可复制粘贴,而且比需要的重得多。此外,它们对可访问性产生负面影响。请复制粘贴您的问题中的文本和format it properly,而不是。

标签: bash find gzip seq


【解决方案1】:

至少有三种直接的方法可以做到这一点:

  1. 在您的示例中,find 是不必要的。只需使用 gzip。
for i in $(seq -w 01 10)
do
    gzip *.2020-${i}-*.log;
done

如果您的文件隐藏在不同级别的子目录中,您需要find。然后就可以使用了

  1. findexec 能力:
for i in $(seq -w 01 10)
do
    find -name "*.2020-${i}-*.log" -exec gzip {} \;
done
  1. xargs 每批文件调用一次gzip 而不是每个文件一次。它还能够并行运行多个实例(请参阅其文档中的-P 标志)。如果您有大量文件:
for i in $(seq -w 01 10)
do
    find -name "*.2020-${i}-*.log" -print0
done | xargs -0 gzip

find-print0 标志使用 ASCII 0 (NUL) 来分隔打印的文件名,xargs' -0 标志使用 ASCII 0 来分隔参数。这样,带有空格奇数字符的文件名将被正确处理。

【讨论】:

    【解决方案2】:

    使用awk

    awk -F"[.-]" '$3 <= "09" && $2 == "2020" {print cmd| "gzip " $0}' input_file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多