移动具有特定修改日期的文件; "找到| xargs ls | grep | -exec"失败w /" -exec:命令未找到"

时间:2017-10-29 14:37:40

标签: linux centos

我使用centos 7

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

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

出现以下错误

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

2 个答案:

答案 0 :(得分:1)

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

但更重要的是,即使你可能ls的结果上使用grepfind只是为了移动文件超过一段时间,你不应该。这样的管道很脆弱,在许多极端情况下失败,例如符号链接,名称中带换行符的文件等。

相反,请使用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占位符来存储多个文件,减少mv命令调用的总数(感谢@CharlesDuffy):

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

答案 1 :(得分:-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

然而,你应该注意不仅要复制/粘贴你从网上不太了解的东西,你可能会破坏你的系统...