在日期后使用 mtime 和 grep 压缩文件

在日期后使用 mtime 和 grep 压缩文件

那里有大量的线索,但没有一个包含整个帽子戏法。我正在尝试tar目录树中比 2019-06-30(±760 天)更新的所有文件,但忽略任何名为backup.我查看了数十个选项,这是我得到的结果:

tar -cvzf newest-files.tar.gz --newer-mtime "760 days ago" client_images/ | grep -v 'backup'

这个执行了正确的过滤(日期和忽略),但不压缩任何内容(empty archive错误):

sudo find client_images/. -mtime -760 | grep -v 'backup'

无法弄清楚如何发生tar

 | tar -cvzf files.tar.gz

我缺少什么?

谢谢。

更新:

这来自我的系统管理员(希望保持匿名):

该命令行将为它找到的每个文件运行 tar 命令,为其创建 (-c) 一个新的 tar 存档(始终称为latestfiles.tar.gz),然后 tar 并将文件压缩到该 tar 存档中。所以最后你留下一个 tar 存档,其中包含“find”命令找到的最后一个文件,所有以前的 tar 存档都被覆盖(因为它总是相同的名称)。

为了防止这种情况发生,您需要使用 add (-r) 而不是 create (-c) tar 选项。不幸的是,这不适用于一个命令中的压缩,因此必须在单独的步骤中进行。如果您不需要压缩,则只需压缩即可。所以,

$ find client_images -type f -mtime -760 -exec tar -rvf newestfiles.tar 
--exclude '*mcith'* {} \; 
$ gzip newestfiles.tar 

答案1

尝试

find client_images -type f -mtime -760 -print0 | tar cvzf files.tar.gz --files-from=- --null --exclude=\*backup\*

这应该指示find仅匹配文件,而不是目录,并输出以 NUL 分隔的名称而不是 lf 分隔的名称(确保安全处理奇怪的文件名)。原因是tar如果有机会的话,它将自行递归到目录中。

添加的选项可tar确保从标准输入 (--files-from=-) 读取要归档的文件列表,并将其视为 NUL 分隔 (--null)。 --exlude 将阻止它归档不需要的文件。

哦,我正在床上用 ipad 打字,所以这一切都未经测试,可能不起作用。

答案2

在 2005 年之前,您尝试使用的方法是合适的,但自 2005 年以来libfind,就可以将这些功能集成find(1)到任何可能有帮助的程序中。

所以请尝试这样的事情:

star -cz -f newest-files.tar.gz  -find client_images -mtime -760 ! -path '*backup*'

star是 schilytols 的一部分,并且可以作为二进制包提供给每个维护良好的发行版。

相关内容