Linux 移动具有特定修改日期的文件&引用;查找“xargs ls”grep“exec”;失败w/“-exec:未找到命令";

Linux 移动具有特定修改日期的文件&引用;查找“xargs ls”grep“exec”;失败w/“-exec:未找到命令";,linux,centos,Linux,Centos,Iam使用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 您编写的-exec没有任何意义,而且似乎您将find语

Iam使用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

您编写的-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

尽管如此,您应该注意的不仅仅是复制/粘贴您从web上并不真正了解的内容,您可能会破坏您的系统…

正如另一个答案所解释的,
-exec
查找
的操作,您不能将其用作shell命令。相反,
xargs
grep
是命令,您不能将它们用作
find
操作,就像您不能在
find
内部使用管道一样

但更重要的是,即使您可以在
find
上使用
ls
grep
来移动超过一定时间的文件,您也不应该这样做。这样的管道是脆弱的,在很多情况下都会失败,比如符号链接、名称中有换行符的文件等等

相反,请使用
find
。你会发现它相当强大

例如,要查看7天前修改的
mv
文件,请使用:

对于
mv
文件,例如
2017-10-20
,您可以使用:

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


Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参见帮助中心中的。也许或者会是一个更好的提问地点。我是centos的新手,但能够理解此脚本非常感谢您的建议。以这种方式解析
ls
非常麻烦。任何带有空格的文件名,您只能从中获取最后一块;带有换行符或其他不可打印字符的文件名的行为更不合理。请参阅深入讨论。鉴于GNU扩展(到<代码>查找< /代码>)已在使用中,您可以考虑使用GNU扩展名为<代码> MV ,并使其成为代码> -ExcMV-T/一些DIR {} + <代码> ->方式>代码>查找< /COD>需要调用更少的<代码> MV调用。
find -name 'fsimage*' -mtime +7 -exec mv '{}' /some/dir/ \;
find -name 'fsimage*' -newermt 2017-10-20 ! -newermt 2017-10-21 -exec mv '{}' /some/dir/ \;
find -name 'fsimage*' -mtime +7 -exec mv -t /some/dir/ '{}' +