我使用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
答案 0 :(得分:1)
正如另一个答案已经解释的那样,-exec
是find
的一个动作,你不能将它用作shell命令。相反,xargs
和grep
是命令,您不能将它们用作find
操作,就像您无法在|
中使用管道find
一样}。
但更重要的是,即使你可能在ls
的结果上使用grep
和find
只是为了移动文件超过一段时间,你不应该。这样的管道很脆弱,在许多极端情况下失败,例如符号链接,名称中带换行符的文件等。
相反,请使用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
然而,你应该注意不仅要复制/粘贴你从网上不太了解的东西,你可能会破坏你的系统...