【问题标题】:Moving files with a specific modification date; "find | xargs ls | grep | -exec" fails w/ "-exec: command not found"移动具有特定修改日期的文件; “find | xargs ls | grep | -exec” 失败 w/ “-exec: command not found”
【发布时间】:2017-10-30 00:40:24
【问题描述】:

我正在使用 centos 7

如果我想查找具有特定名称和特定日期的文件,然后将这些文件移动到另一个文件夹,我会发出命令

find -name 'fsimage*' | xargs ls -ali | grep 'Oct 20' | -exec mv   {}  /hdd/fordelete/  \;

出现以下错误

-bash: -exec: command not found xargs: ls: terminated by signal 13

【问题讨论】:

标签: linux centos


【解决方案1】:

正如另一个答案已经解释的那样,-execfind 的操作,您不能将其用作 shell 命令。相反,xargsgrep 是命令,你不能将它们用作find 动作,就像你不能在find 中使用管道|

但更重要的是,即使您可以find 的结果中使用 lsgrep 只是为了移动超过一定时间的文件,您应该t。这样的管道很脆弱,并且在许多极端情况下都会失败,例如符号链接、名称中带有换行符的文件等。

改为使用find。你会发现它非常强大。

例如,对于 7 天前修改过的 mv 文件,使用 -mtime test

find -name 'fsimage*' -mtime +7 -exec mv '{}' /some/dir/ \;

mv 文件modified on a specific/reference date,例如2017-10-20,你可以使用-newerXY test

find -name 'fsimage*' -newermt 2017-10-20 ! -newermt 2017-10-21 -exec mv '{}' /some/dir/ \;

另外,如果您的mv 支持-t 选项(首先给出目标目录,之后给出多个文件),您可以在find 中为多个文件使用{} + 占位符,从而减少@987654346 的总数@ 命令调用(感谢@CharlesDuffy):

find -name 'fsimage*' -mtime +7 -exec mv -t /some/dir/ '{}' +

【讨论】:

  • 鉴于 GNU 扩展(至 find)已在使用中,您可能会考虑使用 GNU 扩展至 mv,并将其设为 -exec mv -t /some-dir {} + - 这样find 需要调用更少的mv
【解决方案2】:

您写的 -exec 毫无意义,而且您似乎将 find 语法与 shell oe 混合在一起(您写的 -exec 应该传递给 find)

可能有更简洁的方法,但这应该符合您的期望:

 find  -name 'fsimage*' -type f  | xargs ls -ali  | grep 'Oct 20' | awk '{ print $NF }' | while read file; do  mv "$file" /hdd/fordelete/  ; done

尽管如此,您不应该只是从网络上复制/粘贴您不太了解的内容,您可能会破坏您的系统...

【讨论】:

  • 我是 centos 新手,但能够理解这个脚本,非常感谢您的建议
  • 以这种方式解析ls 是非常错误的。任何带有空格的文件名,您只能从中获得最后一块;带有换行符或其他不可打印字符的文件名具有更不明智的行为。请参阅mywiki.wooledge.org/ParsingLs 进行深入讨论。
猜你喜欢
  • 1970-01-01
  • 2019-09-06
  • 2010-11-02
  • 1970-01-01
  • 2019-04-09
  • 2021-12-26
  • 2011-02-12
  • 1970-01-01
  • 2017-08-01
相关资源
最近更新 更多