Linux 移动具有特定修改日期的文件&引用;查找“xargs ls”grep“exec”;失败w/“-exec:未找到命令";
Iam使用centos 7 如果要查找具有特定名称和特定日期的文件,请将这些文件移动到另一个文件夹iam发出命令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语
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/ '{}' +