-exec 缺少什么参数?

-exec 缺少什么参数?

我使用以下命令清除目录中超过 30 天的文件和目录,并将它们移动到存档目录,如果几周后没有人索要文件,我就可以删除该目录。目标目录有按用户名划分的子目录,存档目录也是如此。

这是我使用的命令:

find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;

我建议修改这个版本以回答 ask ubuntu 上的一个问题,另一个用户编辑了代码以更改行尾,\;因为+这样更快(而且更正确?)。看这里

但是,如果命令不是我使用的实际命令,则以+这种方式使用是可行的。如果我尝试使用它,我会收到一条错误消息:-execls -lh+

find: missing argument to '-exec'

我不明白为什么它会这样,也不明白正确的命令是什么。请不要直接发布命令更正,我希望能够理解,而不是盲目地遵循建议。

答案1

该帖子中的用户可能说命令+末尾的符号-exec更快,但没有说明原因。

假设该find命令返回以下文件:

/path/to/file1
/path/to/file2
/path/to/file3

常规-exec命令 ( -exec command {} \;) 针对每个匹配的文件运行一次。例如:

find ... -exec mv {} /target/ \;

执行:

mv /path/to/file1 /target/
mv /path/to/file2 /target/
mv /path/to/file3 /target/

如果使用+符号 ( -exec command {} +),则通过在命令末尾添加多个匹配的文件来构建命令。例如:

find ... -exec mv -t /target/ {} +

执行:

mv -t /target/ /path/to/file1 /path/to/file2 /path/to/file3

要正确使用+标志,传递给 process 的参数必须位于命令的末尾,而不是中间。这就是您的示例中find出现 trows 的原因missing argument to '-exec';它缺少结尾的{}

答案2

用户解释了他们的编辑....

'+' exec 的终止符比 '\;' 更快,请参阅 https://askubuntu.com/questions/558817/what-is-the-difference-between-using-and-in-exec-command;并且从原始文件创建备份文件是个好主意

...使用此链接。我认为基本上它不使用多个命令,而是将所有文件名发送到一个命令实例,以加快速度。以下是来自这里

使用带分号 ( find . -exec ls '{}' \;) 的 -exec 将执行

ls file1
ls file2
ls file3

但是如果你使用加号 ( find . -exec ls '{}' \+),所有文件名将作为参数传递给单个命令:

ls file1 file2 file3

还有其他形式可用,使用;+(来自这里:)

因此,find 命令允许使用以下示例语法:

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

但是,我不确定这是否适用于 move 命令,因为它的语法是 mv [OPTION]... SOURCE DEST,除非-t使用选项或类似选项。但是,它应该可以与ls没有额外选项等一起使用,因为它们可以理解何时给出多个文件名。+可能还需要转义(即\+

相关内容