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

标签 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:胆怯地拒绝创建空存档

最佳答案

首先,你的一句话充满了引用问题:

    如果目录名称包含空格,
  • $dir 将中断。您需要 "$dir" 来代替

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

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

顺便说一句,在这种特殊情况下使用 xargs 是危险的 - 如果您有太多文件,xargs 将调用 tar 超过一次以及除最后一次运行之外的所有存档文件都将在被覆盖时从存档中删除。

此外,此命令还会在包含空格的文件路径上中断 - 默认情况下,xargs 使用空格作为参数分隔符。根据您使用的 findxargs 二进制文件的版本,可能有一个用于 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/

相关文章:

unix - 套接字编程中的绑定(bind)调用混淆

c++ - 使用其 PID 写入 STDIN 以进行处理

linux - 我如何在 Perl 中使用 paste 和 awk?

shell - 具有多个条件的 sed

linux - 管道是否修改了单词的分隔符?

linux - 打印变量值大于特定数字的所有行

c - 判断execvp是成功还是失败

java - 如何使用单个命令在 UNIX 文件系统中提取 JAR 并使用 JAR 命令指定其目标目录?

linux - 在 vim 中折叠代码让我感到困惑

linux - 命令行打开一个窗口