查找文件并使用 -exec 将它们移动到另一个文件夹

查找文件并使用 -exec 将它们移动到另一个文件夹

我尝试查找文件并将它们移动到另一个文件夹

$ find ~ -iregex ".*cheat.*\.pdf" -exec mv "{}" cheatSheet +
find: missing argument to `-exec'

然而测试有效

find ~ -iregex ".*cheat.*\.pdf" -exec echo {} +

我的使用有什么问题吗?

答案1

使用时-exec ... {} +{}必须位于末尾,就在 之前+

这意味着您必须使用

-exec mv -t cheatSheet {} +

这需要访问 GNU mv。如果没有 GNU mv,你会使用

-exec mv {} cheatSheat \;

一次移动一个文件,或者

-exec sh -c 'mv "$@" cheatSheet' sh {} +

调用一个内联脚本来一次性移动所有文件。

你也不需要-iregex。以下内容将更容易阅读和理解:

find "$HOME" -ipath '*cheat*.pdf' \
    -exec sh -c 'mv "$@" cheatSheet' sh {} +

或者,为了清楚起见,以下任一内容符合您的实际意思(这取决于您是否想cheat成为其中的一部分)文件名在路径的末尾(第一个选择),或其中一个目录名在路径中(第二种选择)):

find "$HOME" -iname '*cheat*.pdf' \
    -exec sh -c 'mv "$@" cheatSheet' sh {} +

find "$HOME" -ipath '*cheat*/*' -iname '*.pdf' \
    -exec sh -c 'mv "$@" cheatSheet' sh {} +

请注意,-ipath是一个 GNUfind扩展,但是-iname, 虽然不是标准的,但是更常见的实现。

另外值得注意的是,如果出现名称冲突,即文件名称完全相同,则在移动其他文件的过程中将覆盖一些已移动的文件。使用 GNU mv,您可以通过使用-n选项(不会破坏现有文件)或-b选项(重命名/备份现有文件)来避免这种情况。

有关的:

答案2

需要{}是命令的结尾-exec。该mv命令通过以下选项支持此-t操作:

mv [OPTION]... -t DIRECTORY SOURCE...

所以你的命令是:

find ~ -iregex ".*cheat.*\.pdf" -exec mv -t cheatSheet "{}" +

相关内容