![使用 tar 连接 2 个命令(wc -l + echo ok || echo failed)](https://linux22.com/image/140570/%E4%BD%BF%E7%94%A8%20tar%20%E8%BF%9E%E6%8E%A5%202%20%E4%B8%AA%E5%91%BD%E4%BB%A4%EF%BC%88wc%20-l%20%2B%20echo%20ok%20%7C%7C%20echo%20failed%EF%BC%89.png)
我想用 tar.gz 文件做两件事:
- 检查是否有故障
- 如果成功 - 检查提取的文件数量
我发现这对于第一个选项。我现在像这样运行我的命令:tar -xvzf bad_file.tar.gz && echo ok || echo fail
它会回显所有错误+最后失败,这就是我想要的。
对于第二部分,我曾经使用tar -xvzf bad_file.tar.gz | wc -l
它工作正常,但返回文件数量,即使发生错误也是如此。
第二部分的示例(我在编辑器中打开文件并仅删除了一行):
[root@zt avi]# tar -xvzf damaged_file.tar.gz | wc -l
gzip: stdin: invalid compressed data--crc error
gzip: stdin: invalid compressed data--length error
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
3
如何组合这两个命令?
答案1
单独测试存档的提取,如果成功则计算文件数量。如果您不知道存档解压到的目录的名称,请创建一个新目录并将存档解压到其中。也许是这样的:
#!/bin/sh
if [ -d extracted ]; then
echo 'please remove directory "extracted"' >&2
exit 1
fi
mkdir extracted
if ! tar -xvz -f bad_file.tar.gz -C extracted; then
echo 'extraction failed' >&2
echo 'directory "extracted" may contain partially extracted archive' >&2
exit 1
fi
# extraction of archive was successful, count files extracted
find extracted -type f -exec echo . ';' | wc -l
最后find
为目录中的每个文件输出一个点extracted
。 wc -l
计算点数。我们这样做是为了防止提取的目录中的路径名包含嵌入的换行符。