我知道我可能听起来很奇怪,但我想知道我是否可以在某个文件上执行 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
如果我能做些什么来实现这个
,请告诉我答案 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说:
退出状态
应返回以下退出值:
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),否则将返回错误代码。