【问题标题】:Large number of files renamed by logrotate by mistake, and compressed n times. Rename them correctly大量文件被logrotate错误重命名,压缩了n次。正确重命名它们
【发布时间】:2020-12-09 21:25:03
【问题描述】:

Logrotate 已将已存在的压缩文件压缩 n 次并错误重命名。

一个错误命名文件的例子如下:

v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz.1.gz.1.gz.1.gz.1.gz.1.gz

我的意图是搜索每个文件(它们不一定称为 v_virtual),但我想要修改名称,在此示例中保留主名称 v_virtual,日期和扩展名为 .gz

应该是这样的:

v_virtual.log_2020-08-20.gz

日期将是所述文件的创建日期。

我一直在通过使用 awk、paste 和其他方法来分隔每个文件、按文件名、但我想用一个可以让它更快的脚本来做到这一点。

你能帮帮我吗?

【问题讨论】:

  • 您可以使用sedparameter expansionrename 命令(如果它基于perl)搜索.gz 和之后的所有内容并将其替换为.gz
  • 我不知道 gzip 没有针对双重压缩的检查

标签: bash shell awk find posix


【解决方案1】:

需要改进重要的文件名(ls 不是最好的主意)

#!/bin/bash

for file in ./*.gz.[0-9].gz
  do
    test -f "$file" || continue
    file="${file##*/}"
    mtime=$(stat -c%y "$file")
    mtime=${mtime:0:10}
    name="${file%%.[0-9].gz*}"

    while gzip -t "$name"*.gz.[0-9].gz 2> /dev/null
      do
        out="$(ls -1 "$name"*.gz.[0-9].gz | head -n1)"
        gzip -d "$out"
        mv "${out%*.gz}" "${out%.[0-9].gz}"
    done
    mv -b "${out%.[0-9].gz}" "${name}_${mtime}.gz"

#    echo "'$file' -> '${name}_${mtime}.gz'"
done

假设后缀模式始终为.1.gz,脚本将循环遍历每个文件gunzip,并从文件名中删除.1,直到只剩下一个后缀。当循环结束时,创建日期被添加到文件名中

gzip -d v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz.1.gz.1.gz.1.gz.1.gz.1.gz
mv v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz.1.gz.1.gz.1.gz.1.gz.1 v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz.1.gz.1.gz.1.gz.1.gz
gzip -d v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz.1.gz.1.gz.1.gz.1.gz
mv v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz.1.gz.1.gz.1.gz.1 v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz.1.gz.1.gz.1.gz
gzip -d v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz.1.gz.1.gz.1.gz
mv v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz.1.gz.1.gz.1 v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz.1.gz.1.gz
gzip -d v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz.1.gz.1.gz
mv v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz.1.gz.1 v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz.1.gz
gzip -d v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz.1.gz
mv v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz.1 v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz
gzip -d v_virtual.log.5.gz.1.gz.1.gz.2.gz.1.gz
mv v_virtual.log.5.gz.1.gz.1.gz.2.gz.1 v_virtual.log.5.gz.1.gz.1.gz.2.gz
gzip -d v_virtual.log.5.gz.1.gz.1.gz.2.gz
mv v_virtual.log.5.gz.1.gz.1.gz.2 v_virtual.log.5.gz.1.gz.1.gz
gzip -d v_virtual.log.5.gz.1.gz.1.gz
mv v_virtual.log.5.gz.1.gz.1 v_virtual.log.5.gz.1.gz
gzip -d v_virtual.log.5.gz.1.gz
mv v_virtual.log.5.gz.1 v_virtual.log.5.gz

mv -b v_virtual.log.5.gz v_virtual.log_2020-08-20.gz

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2015-09-28
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    相关资源
    最近更新 更多