如何防止tar创建空档案?

时间:2015-12-11 20:05:45

标签: ksh tar

/tmp/-> ls ab*
/tmp/-> ls: ab*: No such file or directory

/tmp/-> tar -cvf ab.tar abc*
tar: abc*: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors
/tmp/->
/tmp/-> ls ab*
ab.tar
/tmp/-> tar -tvf ab.tar
/tmp/->

可以看出,没有匹配模式abc *的文件,但是创建了名为ab.tar的输出文件而没有内容。是否有一个可以传递给tar命令的开关/选项,以便在没有输入文件时不会创建输出文件?

3 个答案:

答案 0 :(得分:2)

我喜欢在这种情况下使用for - as - if构造:

for x in abc*; do
    # exit the loop if no file matching abc* exists
    test -e "$x" || break
    # by now we know at least one exists (first loop iteration)
    tar -cvf ab.tar abc*
    # and since we now did the deed already… exit the “loop”
    break
done

“循环”的主体只运行一次,但是shell为我们做了一个整体。 (我通常在第一个continue的位置使用break,但这可能不需要。)

或者,您可以使用shell将glob扩展为$* ...

set -- abc*
test -e "$1" && tar -cvf ab.tar abc*

如果您的脚本在set -e下运行,请改用if test …; then tar …; fi,否则在没有文件时会中止。

所有这些变体也适用于普通

答案 1 :(得分:-1)

  

是否有一个可以传递给tar命令的开关/选项,以便在没有输入文件时不会创建输出文件?

Gnu tar没有这样的选项

以下是两种选择。你需要研究它们并弄清楚什么对你有用,因为它们有点像黑客。

您可以执行以下操作:

焦油,测试,空时移除

tar -cvf ab.tar abc* ||
    tar tf ab.tar | read ||
        rm ab.tar

说明:

如果tar -cvf ...失败,请使用tar tf ...获取内容。

如果read失败,则存档为空,并保存以将其删除。

或者你可以试试:

测试,然后是tar

ls abc* | read && tar -cvf ab.tar abc*

这不会首先创建空的tar文件。

答案 2 :(得分:-1)

有一种方法可以让shell执行此操作:

#!/bin/sh
# safetar -- execute tar safely

sh -O failglob -c 'tar cvf ab.tar abc*'