将GZIP多个文件转换为1个文件gz

Cra*_*ezz 0 unix bash shell

我想将超过30天的所有文件备份到1个存档文件中.

我尝试使用这个脚本:

#!/bin/bash

# Find all files that older than 30 days and store it into backup.tar.gz
find ~/Algorithm/test/PDF -mtime +30 -exec tar czvf backup.tar.gz {} \;
Run Code Online (Sandbox Code Playgroud)

但不幸的是,它只备份了最后一个文件而不是所有文件,我发现上面的脚本只是用最后一个替换backup.tar.gz.

如果我的脚本缺少某些内容,请提供建议.

Ala*_*rry 5

当您使用a \;来终止查找-exec时,它会为每个文件运行一次命令.所以你多次运行tar,每次创建一个包含单个文件的tar文件,每个文件覆盖前一个文件.

更改\;为a +并查找将多个文件组合到exec命令的单个运行中,因此它会更好地工作,但潜伏着会有问题.当有太多文件无法放入命令行时,find会将其拆分,您将重复上一个问题.

要真正做到这一点,你想要find生成一个tar可以读取的文件列表,而不是试图在命令行上安装它们.要正确处理所有文件名,您需要以'\ 0'分隔格式列表.GNU tar&find可以做到这一点:

find ~/Algorithm/test/PDF -mtime +30 -print0 |
  tar --null --files-from=- -czvf backup.tar.gz
Run Code Online (Sandbox Code Playgroud)