TAR与--to-command

时间:2016-08-31 07:50:14

标签: tar

我想为tar存档中的所有文件计算MD5。我用--to-command尝试了tar tar -xf abc.tar --to-command='md5sum'
它输出如下。
cb6bf052c851c1c30801ef27c9af1968 -
f509549ab4eeaa84774a4af0231cccae -

然后我想用文件名替换' - ' tar -xf abc.tar --to-command='md5sum | sed "s#-#$TAR_FILENAME#"'它报告错误 md5sum: |: No such file or directory md5sum: sed: No such file or directory md5sum: s#-#./bin/busybox#: No such file or directory tar: 23255: Child returned status 1

2 个答案:

答案 0 :(得分:5)

You don't have a shell so this won't work (you also might see that the | gets to md5sum as an argument). one way could be to invoke the shell yourself, but there is some hassle with nested quotes:

tar xf some.tar --to-command 'sh -c "md5sum | sed \"s|-|\$TAR_FILENAME|\""'

答案 1 :(得分:1)

首先,最好避免使用sed,这不仅是因为它很慢,而且因为$TAR_FILENAME可以包含要由sed解释的魔术字符(您已经注意到,必须使用{{ 1}}而不是#的替代命令,对吗?)。使用不可靠的解决方案,例如/,然后回显实际的文件名。

然后,正如帕特里克(Patrick)在他的回答中提到的那样,如果不使用外壳包裹您就不能使用复杂的命令,但是为了方便起见,我建议使用内置的外壳转义功能,因为bash是head,所以最终命令如下:

printf '%q' "something"

“ 34”是md5sum输出格式的文件名之前的字节数; tar xf some.tar \ --to-command="sh -c $(printf '%q' 'md5sum | head -c 34 && printf "%s\n" "$TAR_FILENAME"')" 代替&&,以使md5sum的错误代码(如果有)到达;;使用tar而不是printf是因为echo可以将带有前导“-”的文件名解释为选项。