如何解决用于将屏幕截图从桌面移动到文件夹的 Bash 脚本
我的桌面上有大量屏幕截图(这是保存它们的默认位置),标题格式为“Screen Shot 2020-10-11 at 7.08.12 PM.png”,我想在“屏幕截图”位上使用带有正则表达式的 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
或类似方法遍历文件夹中的所有文件?
解决方法
您实际上甚至不需要 -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
,但我更喜欢 -name
,因为这里的 shell 模式更短且更易于使用。
{}
是一个占位符,将被找到的名称替换
文件。
\;
是一个 文字 分号,转义以防止它被
由以 -exec
指定的命令结束的 shell 解释。
从表面上看正则表达式(可能是错误的),您应该在正则表达式周围使用单引号:
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
不明白您的意思。使用引号可防止外壳扩展“正则表达式”。您可以在 echo
之前向其他命令添加 mv
以查看将执行的内容。
但是,我不确定您是否知道您的正则表达式匹配什么。不清楚给定的正则表达式是否是 find
的有效正则表达式——尽管它主要用作 PCRE(Perl 兼容)正则表达式。默认情况下,GNU find
使用 GNU Emacs regular expressions,但您可以控制它使用的正则表达式方言。可用选项包括 Emacs、POSIX Awk、POSIX 基本正则表达式 (BRE)、POSIX egrep
和 POSIX 扩展正则表达式 (ERE)。它不包括 PCRE。您提供的更像是 shell glob,而 -name
运算符处理 globbing 名称。
很可能您应该使用 -name
运算符,使用以下命令:
find . -name 'Screen Shot *.png' -exec mv -t ~/screenshots {} +
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。