索拉里斯 11
我想找到所有超过 31 天的文件,将它们压缩并压缩 tar 文件。
我想在一行中完成此操作。我宁愿使用 pbzip2 而不是 gzip!
这是我尝试的原型:
find /tmp -mtime +31 -type f -name "arch*" -exec sh -c 'tar -czvPfE /tmp/old_files_$(date +%F).tar.gz $0' {} \;
问题是它为每个文件创建一个 tar.gz 并覆盖它之前的文件(我希望所有文件都在一个 tar 球中)。除非 tar 存在,否则“r”不起作用。并且“z”调用 gzip 而不是 pbzip2
更新:
@DopeGhoti Thank you. First, my bad for not checking the man page for the "j" option. However, this almost worked. root@myhost:/tmp# find /tmp -mtime +31 -type f -name "arch*"| wc -l =207 root@myhost:/tmp# find /tmp -mtime +31 -type f -name "arch*"| xargs tar -cjf /tmp/old_files_$(date +%F).tbz root@myhost:/tmp# l|tail -rw------- 1 root root 1.6K Nov 30 15:59 old_files_2017-11-30.tbz root@myhost:/tmp# bunzip2 old_files_2017-11-30.tbz root@myhost:/tmp# tar tf old_files_2017-11-30.tar|wc -l =15
答案1
假设文件名不包含换行符,POSIXly(显然除外pbzip2
),默认情况下将文件列表存档在 stdin 上(默认情况下也会将存档写入 stdout 上)
find /tmp -mtime +31 -type f -name "arch*" | pax -w | pbzip2 > file.tar.bz2
或者使用 Solaris tar
,这样您就可以保留您的P
/E
选项:
find /tmp -mtime +31 -type f -name "arch*" |
tar cvPEf - -I /dev/stdin | pbzip2 > file.tar.bz2
-I /dev/stdin
从 stdin 获取文件列表,f -
在 stdout 上输出存档,然后pbzip2
使用pax
.