可以在if语句中使用tar -xvf来返回true或false

时间:2011-07-28 00:55:33

标签: unix shell tar

我知道我可能听起来很奇怪,但我想知道我是否可以在某个文件上执行 if [tar -xvf] 并且这将返回true或false。

如果tarring成功,我需要写一些文件,如果没有,那么在同一个文件上写下其他内容。

类似

if[ find . -maxdepth 1 -name "*.tar" -exec tar -xvf {} ] ; then
echo " Untar Successful"> test.txt
else
echo "Untar Not Successful"> test.txt

如果我能做些什么来实现这个

,请告诉我

4 个答案:

答案 0 :(得分:8)

EXIT STATUS
     The tar utility exits 0 on success, and >0 if an error occurs.

您可以检查错误,如

if [ $? -ne 0 ]; then

哪里有$?是最新的前台管道退出状态。

答案 1 :(得分:3)

您无法可靠地使用find的状态来确定它执行的命令是否成功执行。 find的POSIX定义说:

找到

  

退出状态

     

应返回以下退出值:

     

0所有路径操作数都已成功遍历。

     

>0发生错误。

这与任何有关任何已执行命令的退出状态的说法不同。

xargs实用程序确实提供了您需要的信息。 POSIX说:

xargs的

  

退出状态

     

应返回以下退出值:

     

0实用程序的所有调用都返回退出状态为零。

     

1-125无法汇编满足指定要求的命令行,一个或多个实用程序调用返回非零退出状态,或发生其他一些错误。

     

126找到了实用程序指定的实用程序,但无法调用。

     

127无法找到实用程序指定的实用程序。

所以,你可以使用:

if find . -maxdepth 1 -name "*.tar" -print0 | xargs -0-L 1 tar -xf
then echo "Untar Successful"
else echo "Untar Not Successful"
fi > test.txt

请注意,这仅使用一个重定向。它测试管道的退出状态,这是管道中最后一个命令的退出状态,即xargs的退出状态,它告诉您它是否有效。

-print0-0选项是POSIX标准的GNU扩展。只要您的文件名不包含空格或换行符或标签,您就可以安全地使用-print(并且xargs没有相应的参数)。

答案 2 :(得分:1)

你可以这样做:

find ... -exec sh -c 'tar ... && echo success || echo failure'

find ... -exec sh -c 'if tar ...; then echo success; else echo failure; fi'

(这会为每个文件发出一条消息,您可以包含tar的路径 将{}放入回显的消息中。如果你想在一个报告 最后说明所有的焦油都是成功的,你可以这样做:

if find ... -exec sh -c 'tar ... && echo success || echo failure' |
  grep failure > /dev/null; then
    echo "untar failed"
else
    echo "untar successful"
fi

但这似乎对我没用。

答案 3 :(得分:0)

你绝对可以对tar文件执行“tar -tf”。选项可能非常符合您的扩展名。您还可以添加选项“v”以获得详细信息。

tar -Jtf "ABC.tar.xz"
tar -jtf "ABC.tar.bzip2"
tar -tf "ABC.tar"

您甚至可以找到文件列表。

tar -tf "ABC.tar" "./ABC/hello.c" >/dev/null 2>&1

如果zip文件中存在文件hello.c,它将返回成功(0),否则将返回错误代码。