当我在命令行上使用此命令并使用参数 $dir、$year、$month 的硬编码值时,它工作得很好并创建 gzip 文件。我检查了 gz 文件的内容,看到了所需的结果。
find $dir -name '*_$year-$month-*' -type f -print | \
xargs tar -zvcf $dir/log.$year-$month.tar.gz
但是当我将其嵌入 shell 脚本并运行时,它不会运行并给出此错误。
tar:胆怯地拒绝创建空存档
最佳答案
首先,你的一句话充满了引用问题:
-
如果目录名称包含空格,
$dir
将中断。您需要"$dir"
来代替单引号可防止变量扩展 -
'*_$year-$month-*'
可能应该是"*_$year-$month-*"
.在您的 shell 脚本代码中,
find
不会匹配任何文件(您没有任何带有字符串_$year-$month-
的文件名,是吗? ?),因此tar
将不会随任何要包含在存档中的文件一起提供。
顺便说一句,在这种特殊情况下使用 xargs
是危险的 - 如果您有太多文件,xargs
将调用 tar
超过一次以及除最后一次运行之外的所有存档文件都将在被覆盖时从存档中删除。
此外,此命令还会在包含空格的文件路径上中断 - 默认情况下,xargs
使用空格作为参数分隔符。根据您使用的 find
和 xargs
二进制文件的版本,可能有一个用于 find 的 -print0
选项和一个匹配的
选项来处理此问题:xargs
的 -0
find ... -print0 | xargs -0 ...
最后,一些 xargs
版本有一个选项,可以在没有提供参数的情况下避免调用指定的命令 - 对于 GNU xargs
来说,这是 -r
选项:
find ... -print0 | xargs -0 -r ...
关于Unix - 使用 tar 和 gz 查找命令在命令行中运行良好,但不适用于脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14506266/