繁体   English   中英

移动具有特定修改日期的文件; “find | xargs ls | grep | -exec”失败,“-exec: command not found”

[英]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

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

但更重要的是,即使您可以find的结果上使用lsgrep来移动超过一定时间的文件,但您不应该. 这种管道很脆弱,在许多极端情况下都会失败,例如符号链接、名称中带有换行符的文件等。

相反,请使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM