那里有大量的线索,但没有一个包含整个帽子戏法。我正在尝试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 的一部分,并且可以作为二进制包提供给每个维护良好的发行版。