我尝试查找文件并将它们移动到另一个文件夹
$ 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 "{}" +