2

当我在命令行上使用此命令并为参数 $dir、$year、$month 提供硬编码值时,它运行良好并创建了 gzip 文件。我检查了 gz 文件的内容,我看到了想要的结果。

find $dir -name '*_$year-$month-*' -type f -print | \
xargs tar -zvcf $dir/log.$year-$month.tar.gz

但是当我将它嵌入到 shell 脚本中并运行时,它不会运行并给我这个错误。

tar: Cowardly refusing to create an empty archive

4

3 回答 3

2

首先,您的单行中充满了引用问题:

  • $dir如果目录名称包含空格,则会中断。你"$dir"需要

  • 单引号防止变量扩展 -'*_$year-$month-*'应该是"*_$year-$month-*".

    在您的 shell 脚本代码中,find不会匹配任何文件(您没有任何带有 string 的文件名_$year-$month-,是吗?),因此tar不会提供任何要包含在存档中的文件。

在旁注中,xargs在这种特殊情况下使用是危险的 - 如果您有太多文件,xargs将多次调用tar,并且除了最后一次运行之外的所有存档文件都将从存档中删除,因为它被覆盖。

此外,此命令还将中断带有空格的文件路径 - 默认情况下xargs使用空格作为参数分隔符。根据您使用的版本findxargs二进制文件,可能有一个-print0查找选项和一个匹配-0选项xargs来处理此问题:

find ... -print0 | xargs -0 ...

最后,xargs如果没有提供参数,某些版本有一个选项可以避免调用指定的命令 - 对于 GNU xargs,这是一个-r选项:

find ... -print0 | xargs -0 -r ...
于 2013-01-24T16:41:17.367 回答
0

如果可以的话,尝试将shellscript 中的,echo​​ 的值放到控制台上。这些值在 shellscript 中可能不同。$dir$year$month

find其次,shellscripttar使用的是哪个?尝试使用完整路径进行诊断或修改 的值$PATH以匹配从命令行运行命令时获得的值。

于 2013-01-24T16:42:48.350 回答
0

变量替换不会发生在单引号内。

使用双引号:find "$dir" -name "*_$year-$month-*" ...

(如果需要,您可以在同一参数中使用不同类型的引号(不在此处)'*_'"$year":)

于 2013-01-24T16:41:52.733 回答