find命令 - 带-exec句柄的语法

时间:2014-07-01 01:25:47

标签: linux bash unix find gzip

背景和问题:

我正在使用find命令来gzip符合我的条件的所有文件:

sudo -u userAccount -i find /apps/server/userAccount/logs/. -maxdepth 1 -type f -exec gzip {} \;

这将继续按照我的标准压缩所有文件,但我不想提示覆盖 - 我希望能够自动跳过并存档已存在的文件,因为我正在处理敏感数据,不能冒任何损失的风险。

到目前为止,我已经尝试过:

  1. 上述声明 -exec yes n | gzip {} \;
  2. 上述语句 -exec [if语句判断文件是否已存在]
  3. 由于发现语句语法错误,这些都不起作用。

    问题:

    有人知道如何使用我的find语句使用上述任何一种方法吗?

    更新

    我试图使用:

    sudo -u userAccount -i find /apps/server/userAccount/logs/. -maxdepth 1 -type f -exec bash -c "yes n | gzip {}" \;
    

    但我只是滚动' y'字符返回到控制台,直到我CTRL-C。有什么建议?

2 个答案:

答案 0 :(得分:2)

-exec之后的命令不是由shell运行的,它由find直接执行,因此它不能使用shell元字符或内置函数。如果需要使用shell,则必须明确调用它:

-exec bash -c "yes n | gzip {}" \;

答案 1 :(得分:1)

如果您不想在gzip命令中使用管道,可以使用案例来测试您的文件类型。

find $PATH_TO_LOGS -maxdepth 1 -mtime +$SOME_NUMBER_OF_DAYS -exec sh -c "case {} in *.gz) ;; *)  gzip '{}' ;; esac;" \;

当然,这取决于您的文件名以传统的.gz扩展名结尾。这样做的好处是您还可以通过此表单中的扩展名处理其他文件类型。

此外,如果您真的不想丢失任何内容,并且不能依赖备份副本,那么最好为文件加盖时间戳并简单地占用存储空间。

find $PATH_TO_LOGS -maxdepth 1 -mtime +$SOME_NUMBER_OF_DAYS -exec gzip -N {} \;