/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命令的开关/选项,以便在没有输入文件时不会创建输出文件?
答案 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
,否则在没有文件时会中止。
所有这些变体也适用于普通sh。
答案 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*'