【问题标题】:move command with regular expressions使用正则表达式移动命令
【发布时间】:2019-09-21 04:03:40
【问题描述】:

Bash 无法识别此 mv 命令中的正则表达式:

mv ../downloads'^[exam].*$[.pdf]  ../physics2400/exams

我正在尝试将文件从下载目录移动到我为它们创建的目录中。

这种文件的一个例子是'Exam 2 Practice Homework (Solutions).pdf' (单引号显然是 Bash 文件的一部分。

下载文件夹中有许多其他文件,因此无论如何都是正则表达式或尝试。

【问题讨论】:

  • shell 不使用正则表达式来匹配文件名,它使用通配符(或“glob”)表达式。而且您的正则表达式没有意义,所以我不确定 glob 等价物是什么。
  • 该正则表达式不会匹配任何内容,因为$ 之后有文本。就像@GordonDavisson 所说,这没有任何意义。就mv exam.*pdf(这是我根据你写的最接近的猜测)。
  • 另一个注意事项:当像这样进行批量移动时,总是使用 mv -imv -n 以防止 mv 在出现名称冲突时静默且不可逆地删除文件.还有……你有备份吗?对于您不想丢失的任何内容,您应该始终拥有至少一份备份。
  • @-Gordon Davisson - move 命令的 -n 选项有什么作用。我很难查找它。它不在手册页上,也没有在谷歌搜索中显示。我确实找到了交互式提示的 -i 选项。
  • @teaNcode -n 告诉mv 根本不要覆盖现有文件;这就像使用mv -i,然后在每次询问是否应该覆盖某些内容时输入“n”。您可能有一个没有此选项的mv 版本(您使用的是什么操作系统和版本?)。这是Linux man page for mv,其中列出了-n

标签: bash shell


【解决方案1】:

执行文件名扩展时,Bash 不使用正则表达式。相反,使用了一种称为通配符的模式匹配。这在Filename Expansion section of the Bash manual 中进行了讨论。

关于您的示例文件名 (Exam 2 Practice Homework (Solutions).pdf),请注意以下几点:

  • 单引号不是文件名的一部分,但可以方便地避免必须转义文件名中的特殊字符(即空格和括号)。没有引号,文件名将被指定为Exam\ 2\ Practice\ Homework\ \(Solutions\).pdf。请参阅Quoting section of the Bash manual 了解更多详情。
  • 类 Unix 操作系统中的文件系统区分大小写,因此您需要考虑文件名开头的大写 E

这是一个模式匹配表达式,它将匹配您的示例文件名以及其他以Exam 开头并以.pdf 结尾的文件。

mv ../downloads/Exam*.pdf ../phyiscs2400/exams

如果您有以Examexam 开头的文件,您可以使用以下内容来解决这两个问题:

mv ../downloads/[Ee]xam*.pdf ../phyiscs2400/exams

括号中的表达式被解释为“匹配任何一个括起来的字符”。这允许您同时考虑大写和小写。

在执行此类mv 命令之前,我将通过运行ls 来测试文件名扩展,以验证预期的文件是否匹配:

ls ../downloads/[Ee]xam*.pdf

【讨论】:

  • 这个移动命令的目的是我可以从我的下载目录中的学校网站下载学校文件。我在我的个人笔记本电脑上运行 Ubuntu Linux,并强迫自己不使用 GUI,而是使用命令行将下载的文件重新定位到我为每个类创建的正确目录中。所以有些是物理文件,有些是数字设计文件,等等。都有不同的名称和文件扩展名。
  • 好的。如果您编辑问题并提供有关您正在处理的文件名的更多详细信息,我也许可以就如何指定模式匹配表达式提供更具体的指导。请参考How to create a Minimal, Reproducible Example
  • 好的,我编辑了问题并阅读了您在之前评论中发布的文档链接。如果我的编辑需要改进,请告诉我。此外,感谢您在此站点上指导我以及随附的程序。在发布问题方面仍有经验。
  • @teaNcode -- 使用 GUI 很好,只需打开一个(或两个)xterm。如果您将 KDE 作为桌面,那么 konsole 提供了最好的选项卡式 xterms 之一。如果没有,您始终可以使用tmuxscreen 在单个xterm 中处理多个会话。你正在以正确的方式去做。很快你就会想知道在你使用的所有其他操作系统中没有开放终端的情况下你是如何生活的。支付入场费,通过Advanced Bash-Scripting Guide,然后学习grep, sed & awk。现在花费 10 小时将节省 1000 小时。
【解决方案2】:

如果要使用正则表达式,这个怎么样?

find ./downloads -regex '.*\.pdf' -exec mv '{}' exams/ \;

【讨论】:

    猜你喜欢
    • 2013-07-07
    • 2022-11-29
    • 1970-01-01
    • 2012-06-21
    • 2013-08-07
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多