我有一个包含以下内容的文件夹(子文件夹和文件名是固定的,无法更改):
# 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
(请注意,我没有重定向stderr
到tar
)/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 |