我使用以下命令清除目录中超过 30 天的文件和目录,并将它们移动到存档目录,如果几周后没有人索要文件,我就可以删除该目录。目标目录有按用户名划分的子目录,存档目录也是如此。
这是我使用的命令:
find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;
我建议修改这个版本以回答 ask ubuntu 上的一个问题,另一个用户编辑了代码以更改行尾,\;
因为+
这样更快(而且更正确?)。看这里
但是,如果命令不是我使用的实际命令,则以+
这种方式使用是可行的。如果我尝试使用它,我会收到一条错误消息:-exec
ls -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
用户解释了他们的编辑....
...使用此链接。我认为基本上它不使用多个命令,而是将所有文件名发送到一个命令实例,以加快速度。以下是来自这里:
使用带分号 (
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
没有额外选项等一起使用,因为它们可以理解何时给出多个文件名。+
可能还需要转义(即\+
)