我在 Windows 上使用 bash(与 msysgit 一起分发)来压缩日志文件 - 每个日期一个存档。问题是,以下脚本不起作用,我不知道为什么。剪切用于获取与日志写入日期相对应的文件名的一部分。
find . -type f -name '*.log' | cut -c3-12 | head -n 5 | xargs -I common printf "%s%s\n" common "*.log" | xargs -I fg tar cvzf hello.tgz fg
在最后一步之前,每一行看起来都像这样 - 2014-07-04*.log
在最后一步,它给我这样的输出:
tar: 2014-07-01*.log: Cannot stat: No such file or directory
我怀疑这是因为末尾有一个换行符,因为当我手动调用 tar 命令时,它工作正常。有什么想法我错过了什么吗?我读了一些类似的答案,但它们似乎不适用于我的情况。例如,存档名称,稍后我会使其更具描述性。
答案1
问题是这个部分:
xargs -I common printf "%s%s\n" common "*.log"
插入*.log
到模板中照原样。我完全不明白你为什么把“*”放在那里。这可以解决这个问题:
xargs -I common printf "%s%s\n" common .log
但是,最后一个tar
命令实际上并不起作用,因为该tar cvzf hello.tgz fg
命令将针对每个文件执行,因此您最终会得到一个包含单个文件(最后一个)的 tar。
我相信这应该更接近你想要的:
find . -type f -name '*.log' | cut -c3-12 | uniq | xargs -I{} sh -c 'tar zcvf {}.tgz {}*.log'
如果你有如下文件:
2014-07-01.1.log
2014-07-01.2.log
2014-07-02.1.log
2014-07-02.5.log
2014-07-02.6.log
然后命令会将前 2 个放入2014-07-01.tgz
,将后 3 个放入2014-07-02.tgz
。