我想为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
答案 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
可以将带有前导“-”的文件名解释为选项。