我的桌面上有大量截图(这是保存它们的默认位置),它的标题是“屏幕快照2020-10-11 at 7.08.12 PM.png”,我想使用带有regex的bash脚本在“屏幕快照”位上将任何这样的文件从我的桌面移动到我创建的文件夹“屏幕快照”。
现在,我正在玩find . -regex Screen*.*?.png,但是它不太好用(它给了find: Screen Shot 2020-10-11 at 7.11.09 PM.png: unknown primary or operator)。
当输出找到所有正确的文件以将它们移动到文件夹时,我也不确定如何使用它。您能以某种方式使用for i in seq 1 100或诸如此类的方法来遍历文件夹中的所有文件吗?
发布于 2020-12-26 15:31:14
在这里,您甚至不需要-regex:
find . -type f -name 'Screen Shot*png' -maxdepth 1 -exec echo mv "{}" screenshots \;您可以安全地运行这个命令,因为它不会做任何事情,只会打印它要做的事情。删除echo以实际运行mv。
所有使用的选项都记录在man find中,但简而言之:
-type f将使find只查找文件,而不是目录。如果您有一个与-name匹配的目录,这是非常有用的--我们不想碰它。
-maxdepth 1只会在相同的目录级别上查看火文件--在这里非常有用,因为您可能已经有一些与screenshots目录中的-name匹配的文件了--我们想让它们单独使用。
-name接受shell模式,而不是regex。当然,我们可以在这里使用-regex,但是我更喜欢-name,因为shell模式在这里更短更容易使用。
{}是一个占位符,将被替换为查找文件的名称。
\;是一个文字分号,转义是为了防止它被以-exec指定的命令结尾的shell所解释。
发布于 2020-12-26 15:30:37
如果将正则表达式取为面值(可能是个错误),则应该在regex周围使用单引号:
find . -regex 'Screen*.*?.png'这将阻止shell展开它,将其留给find处理。然后,要将文件移动到~/screenshots目录(更改名称以匹配要使用的目录),如果您有GNU mv,可以使用:
find . -regex 'Screen*.*?.png' -exec mv -t ~/screenshots {} +这将执行一个mv命令将多个文件移动到目标目录,从而减少执行mv的次数。它可能仍然被多次执行,但它将比替代方案少得多。
如果您没有带有(非常有用的) mv选项的GNU -t,那么您应该使用:
find . -regex 'Screen*.*?.png' -exec mv {} ~/screenshots ';'这会对找到的每个文件执行一个mv命令,但更便于移植。
您遇到的主要问题是,shell正在扩展您所写的文件名列表,然后find不理解您的意思。使用引号可以防止shell展开“regex”。您可以将一个echo添加到mv之前的其他命令中,以查看将执行什么。
但是,我不确定你是否知道你的regex匹配什么。不清楚给定的正则表达式是否是find的有效正则表达式--尽管它主要是作为一个PCRE (与Perl兼容的)正则表达式工作的。默认情况下,GNU find使用GNU 正则表达式,但您可以控制它使用的正则表达式的方言。可用的选项包括Emacs、POSIX Awk、POSIX基本正则表达式(BRE)、POSIX egrep和POSIX扩展正则表达式(ERE)。不包括PCRE。您所提供的更像是一个shell glob,-name运算符处理全局名称。
很可能您应该使用-name操作符,使用以下命令:
find . -name 'Screen Shot *.png' -exec mv -t ~/screenshots {} +https://stackoverflow.com/questions/65457881
复制相似问题