【问题标题】:find command - syntax with -exec handle查找命令 - 带有 -exec 句柄的语法
【发布时间】:2014-07-01 01:25:46
【问题描述】:

背景和问题:

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

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

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

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

  1. 声明如上 -exec yes n | gzip {} \;
  2. 上面的语句 -exec [判断文件是否已经存在的if语句]

由于 find 语句语法错误,这些都不起作用。

问题:

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

更新:

我尝试使用:

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

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

【问题讨论】:

  • 最简单的方法是编写一个执行你想要的shell脚本,并使用-exec scriptname {} \;
  • -exec 后面不能放管道。这会将find 的输出通过管道传送到下一个命令。

标签: linux bash unix find gzip


【解决方案1】:

-exec之后的命令不是shell运行的,而是find直接执行的,所以不能使用shell元字符或内置命令。如果你需要使用 shell,你必须显式调用它:

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

【讨论】:

  • 所以当我将它与我的命令一起使用时,在我的控制台出错之前,我不会得到级联的 'y' 字符。我正在使用这个命令---> sudo -u userAccount -i find /apps/server/userAccount/logs/。 -maxdepth 1 -type f -exec bash -c "yes n | gzip {}" \;
  • sudo 中嵌套命令可能会出现引用问题。你可以尝试使用sudo -s 来获得 shell 命令提示符,然后按照我给它的方式输入命令。
【解决方案2】:

如果您不想对 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 {} \;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2012-04-07
    • 2011-04-06
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多