背景和问题:
我正在使用find命令来gzip符合我的条件的所有文件:
sudo -u userAccount -i find /apps/server/userAccount/logs/. -maxdepth 1 -type f -exec gzip {} \;
这将继续按照我的标准压缩所有文件,但我不想提示覆盖 - 我希望能够自动跳过并存档已存在的文件,因为我正在处理敏感数据,不能冒任何损失的风险。
到目前为止,我已经尝试过:
由于发现语句语法错误,这些都不起作用。
问题:
有人知道如何使用我的find语句使用上述任何一种方法吗?
更新
我试图使用:
sudo -u userAccount -i find /apps/server/userAccount/logs/. -maxdepth 1 -type f -exec bash -c "yes n | gzip {}" \;
但我只是滚动' y'字符返回到控制台,直到我CTRL-C。有什么建议?
答案 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 {} \;