[英]Moving files with a specific modification date; "find | xargs ls | grep | -exec" fails w/ "-exec: command not found"
我正在使用 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
正如另一个答案已经解释的那样, -exec
是find
一个操作,您不能将其用作 shell 命令。 相反, xargs
和grep
是命令,不能将它们用作find
操作,就像不能使用管道|
里面find
。
但更重要的是,即使您可以在find
的结果上使用ls
和grep
来移动超过一定时间的文件,但您不应该. 这种管道很脆弱,在许多极端情况下都会失败,例如符号链接、名称中带有换行符的文件等。
相反,请使用find
。 你会发现它非常强大。
例如,对于 7 天前修改的mv
文件,请使用-mtime
测试:
find -name 'fsimage*' -mtime +7 -exec mv '{}' /some/dir/ \;
要在特定/参考日期修改的mv
文件,例如2017-10-20
,您可以使用-newerXY
测试:
find -name 'fsimage*' -newermt 2017-10-20 ! -newermt 2017-10-21 -exec mv '{}' /some/dir/ \;
此外,如果您的mv
支持-t
选项(首先提供目标目录,然后提供多个文件),您可以在find
使用{} +
placeholder 多个文件,减少mv
命令调用的总数(感谢@CharlesDuffy):
find -name 'fsimage*' -mtime +7 -exec mv -t /some/dir/ '{}' +
您编写的 -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
尽管如此,您应该注意不要只是复制/粘贴您从网络上不太了解的内容,您可能会破坏您的系统......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.