当我在命令行上使用此命令时,参数$ 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
答案 0 :(得分:2)
首先,你的单行充满了引用问题:
$dir
将中断。您需要"$dir"
而不是
单引号可防止变量扩展 - '*_$year-$month-*'
可能应为"*_$year-$month-*"
。
在您的shell脚本代码中,find
将无法匹配任何文件(您没有任何带有字符串_$year-$month-
的文件名,是吗?)因此tar
将不会提供要包含在档案中的任何文件。
在旁注中,在此特定情况下使用xargs
是危险的 - 如果您的文件太多,xargs
将多次调用tar
并且除了最后一次运行将被覆盖时从存档中删除。
此外,此命令也会在具有空格的文件路径上中断 - 默认情况下xargs
使用空格作为参数分隔符。根据您使用的find
和xargs
二进制文件的版本,可能会有一个-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}}的值以匹配从命令行运行命令时获得的值。