tar 到 stdout:丢失输入文件而不影响 PIPESTATUS

tar 到 stdout:丢失输入文件而不影响 PIPESTATUS

我有一个包含以下内容的文件夹(子文件夹和文件名是固定的,无法更改):

# ls
data/ config/ myfile

我需要创建一个 tar 存档标准输出dd在 Bash 脚本中处理它;为了简单起见,假设这样:

# /bin/tar -cz data config myfile 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null

在这条指令之后,我立即检查变量${PIPESTATUS[0]}是否为 0,以了解tar其工作是否成功。

问题是那myfile选修的对我来说,如果缺少它,我${PIPESTATUS[0]}就会变成 2,即使我不想将其视为错误。那么我如何指示tar忽略丢失的输入文件呢?如果可能的话,我更喜欢一行语句。

答案1

那么如何指示 tar 忽略丢失的输入文件呢?

这非常简单:只需--ignore-failed-read在命令中使用该标志即可tar

$/bin/tar -cz --ignore-failed-read data config myfile 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null

$ echo ${PIPESTATUS[0]}

> 0

顺便说一句:请注意,答案豪克拉格比较麻烦,但tar只有在一切正常的情况下才返回 0,或者如果唯一缺少的文件是myfile... 则tar返回 0 如果一切正常,甚至当任何文件丢失时。


有了这个:

/bin/tar -cz --ignore-failed-read data config myfile | /bin/dd of=backup.tar 2>/dev/null

(请注意,我没有重定向stderrtar/dev/null如果myfile不存在,tar则返回0(当然,如果没有其他错误),然后您就可以得到stderr/bin/tar: myfile: Warning: Cannot stat: No such file or directory

tar手册说:

'--ignore-failed-read' 不要在不可读的文件或目录上以非零值退出。该选项仅在创建期间有效。它指示 tar 将任何丢失或不可读的文件(目录)视为轻微情况。此类故障不会影响程序退出代码,并且相应的诊断消息被标记为警告,而不是错误。可以使用“--warning=failed-read”选项来抑制这些警告

但是,唉,--warning=failed-read抑制有关读取错误的所有警告:在您的情况下,抑制有关不存在的文件的警告,但也抑制有关输入/输出错误,例如...远非最佳;显然,tar没有一个标志可以说明这一点:嘿,仅当文件不存在时才抑制读取失败警告,所以,这可能可以解决您的问题:

/bin/tar -cz --ignore-failed-read data config myfile 2> >(grep -v 'No such file or directory' 1>&2) | /bin/dd of=backup.tar 2>/dev/null

>( ... )流程替代

这样,tail如果文件不存在,您的命令不会更改其返回号,您不会收到有关丢失文件的警告消息,并且会收到有关任何其他读取错误的警告消息。


这个>

我不禁认为这些解决方案都不是很好,所以,我想出了这个:

/bin/tar -cz -T <(\ls -A -1) 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null

这样,您tar只发送到命令执行时真正存在的文件:您不需要担心它们的名称,甚至不需要担心哪个文件存在或不存在:您总是执行相同的命令(无论如何) ,如果缺少 1 个文件,则可以完美缩放,或者n文件丢失,并且您不会错过任何错误。

(注意反斜杠if 命令前面ls:这样,您可以防止任何ls别名,因此,其输出更可靠)

答案2

如果可以选择更改tar呼叫:

test -e myfile && myfile=myfile || myfile=
/bin/tar -cz data config $myfile 2>/dev/null |

相关内容