从表面上看正则表达式(可能是一个错误),您应该在正则表达式周围使用单引号:
find . -regex 'Screen*.*?.png'
这可以防止外壳扩展它,将其留给find。然后将文件移动到~/screenshots目录(更改名称以匹配您要使用的目录),如果您有GNU mv,您可以使用:
find . -regex 'Screen*.*?.png' -exec mv -t ~/screenshots {} +
这会执行一个mv 命令将许多文件移动到目标目录,从而减少mv 的执行次数。它可能仍会执行多次,但会比替代方案少得多。
如果您没有带有(非常有用的)-t 选项的 GNU mv,那么您应该使用:
find . -regex 'Screen*.*?.png' -exec mv {} ~/screenshots ';'
这将为找到的每个文件执行一个mv 命令,但更便携。
您遇到的主要问题是外壳将您写入的内容扩展为文件名列表,然后find 不明白您的意思。使用引号可以防止外壳扩展“正则表达式”。您可以在mv 之前的其他命令中添加echo,以查看将执行的操作。
但是,我不确定您是否知道您的正则表达式匹配什么。目前尚不清楚给出的正则表达式是否是find 的有效正则表达式——尽管它主要用作 PCRE(Perl 兼容)正则表达式。默认情况下,GNU find 使用 GNU Emacs regular expressions,但您可以控制它使用的正则表达式的方言。可用的选项包括 Emacs、POSIX Awk、POSIX 基本正则表达式 (BRE)、POSIX egrep 和 POSIX 扩展正则表达式 (ERE)。它不包括 PCRE。您提供的更像是一个 shell glob,-name 运算符处理通配名称。
您很可能应该使用-name 运算符,使用如下命令:
find . -name 'Screen Shot *.png' -exec mv -t ~/screenshots {} +