能否同时将tar命令的输出通过管道传输到split命令和md5sum检查中?

4

我有一个压缩命令,将其作为管道输出给md5sum检查命令:

   tar zcvpf file.tar.gz file | xargs -I '{}' bash -c "test -f '{}' && md5sum '{}'" | tee file_mybackup.md5

我现在想将tar.gz文件分成100MB的块。我可以通过以下方式实现:

   tar zcvpf - file | split -d -b 1M - file.tar.gz.

有没有办法将tar命令的输出同时传输到split命令和md5sum检查中?我知道split不会输出到STDOUT,所以我无法从split命令传输到md5sum命令。我尝试使用命名管道:

    mkfifo newpipe

    tar zcvpf - file | tee newpipe | split -d -b 1M - file.tar.gz. &

    cat newpipe | xargs -I '{}' bash -c "test -f '{}' && md5sum '{}'" | tee file_mybackup.md5

然而,这无法输出md5sum输出。如有帮助将不胜感激。

command | tee >(command 2) | command 3 - 123
你的 xargs 使用方法有误:你的代码存在任意代码执行漏洞! - gniourf_gniourf
好的,我采用@999999999999999999999999999999的方法:tar zcvpf - file | tee >(xargs -I '{}' bash -c "test -f '{}' && md5sum '{}'" > file.md5) | split -d -b 1M - file.tar.gz.但是这会出现错误:xargs: Warning: a NUL character occurred in the input. It cannot be passed through in the argument list. Did you mean to use the --null option?如何将STDOUT重定向到xargs -I命令? - user1977981
2个回答

3

好的,最终我找到了一个解决方案

    tar zcvpf >(split -d -b 1M - file.) file | xargs -I '{}' bash -c "test -f '{}' && md5sum '{}'" | tee file.md5

我将标准输入重定向到初始tar命令中的split命令,同时将此tar的输出传输到xargs。希望这对其他人有所帮助。

2

您的命令:

tar zcvpf file.tar.gz file | xargs -I '{}' bash -c "test -f '{}' && md5sum '{}'" | tee file_mybackup.md5

在减少磁盘读取量方面,下面这个更简单的命令(即不需要 xargs)并没有更有效率:

tar zcvpf file.tar.gz file && md5sum file | tee file_mybackup.md5

因为在这两种情况下,tar只读取一次file,而md5sum会再次读取一次。

除非我没有理解你想要实现的目标,否则您需要最小化磁盘读取的命令是:

cat file | tee >(md5sum | sed 's/-/file/' > file_mybackup.md5) | gzip -c | split -d -b 1M - file.gz.

注意:由于您正在存档单个文件而不是目录,因此我只使用了 gzip 而不是 tar。是的,这种方法不会存储文件权限,并且不能用于目录!... 这是一个要求吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接