使用正则表达式移动命令

时间:2019-09-21 04:03:40

标签: bash shell

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

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

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

此类文件的一个示例是'Exam 2 Practice Homework (Solutions).pdf' (单引号显然是Bash中文件的一部分。

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

2 个答案:

答案 0 :(得分:1)

执行文件名扩展时, Bash不使用正则表达式。取而代之的是,使用一种称为“ globbing”的模式匹配。 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

答案 1 :(得分:0)

如果要使用正则表达式,该怎么办?

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