Unix - 使用tar和gz查找命令在命令行中运行良好,但不能在脚本上运行

时间:2013-01-24 16:37:16

标签: unix

当我在命令行上使用此命令时,参数$ 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

3 个答案:

答案 0 :(得分:2)

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

    如果目录名称包含空格,则
  • $dir将中断。您需要"$dir"而不是

  • 单引号可防止变量扩展 - '*_$year-$month-*'可能应为"*_$year-$month-*"

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

在旁注中,在此特定情况下使用xargs是危险的 - 如果您的文件太多,xargs将多次调用tar并且除了最后一次运行将被覆盖时从存档中删除。

此外,此命令也会在具有空格的文件路径上中断 - 默认情况下xargs使用空格作为参数分隔符。根据您使用的findxargs二进制文件的版本,可能会有一个-print0选项用于查找,并且-0选项可用于xargs处理这个问题:

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

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

如果可以,请尝试从shellcript中echo $dir$year$month的值find到控制台。 shellcript中的值可能不同。

Secodly,tar$PATH是shellcript使用的?尝试使用完整路径进行诊断或修改{{1}}的值以匹配从命令行运行命令时获得的值。