移动与正则表达式模式匹配的文件

移动与正则表达式模式匹配的文件

我有一个包含数千个文件的目录。其中许多是文件名以图像分辨率开头的图像。图像的高度和宽度可以是两位、三位、四位或五位数字。例如:

 - 986x1088_lalbslj.jpg
 - 2043x924_fjnndkk.jpg
 - 9560x12643_fjknfd.jpg
 - 24x24_dnjkan.jpg

我想将所有这些图像收集在一个新目录中(例如./images/)。听起来很简单。
简单的正则表达式[0-9]+x[0-9]+.*与这些文件名匹配,但据我所知,您不能将正则表达式与mv.
理想情况下,我希望这样的东西能够工作:mv [0-9]+x[0-9]+.* images,但当然,事实并非如此。

似乎这个问题之前已经被问过很多次了,而且我已经在这个和其他 StackExchange 上查看了几十个(字面意思!)类似的线程,但遗憾的是我还没有看到对我有帮助的答案。大多数时候,接受的答案只是简单地解释mv使用 glob 而不是正则表达式,或者建议一个相应的 glob 来帮助作者,但在我的情况下不起作用。所以我想试试自己的运气,问自己的问题——我希望没问题。

我似乎无法将我的模式压缩成任何合理的 glob,并且正则表达式不适用于mv,那么我该怎么办?
当然这一定是可能的?

非常感谢您的热情回复!

答案1

您可以使用扩展的全局

如果extglob使用内置选项启用 shell 选项shopt,则会识别多个扩展模式匹配运算符。在下面的描述中,模式列表是由“ ”分隔的一个或多个模式的列表|。复合图案可以使用以下一种或多种子图案形成:[...]

+(pattern-list)
匹配给定模式的一次或多次出现。

所以:

shopt -s extglob
mv +([0-9])x+([0-9])* ./images

答案2

您可以使用以下循环来实现您的目标:

for i in *
do
    echo "$i" | grep -qE "^[[:digit:]]+x[[:digit:]]+.*" && mv "$i" images
done

您可以更改正则表达式以指定 2 到 5 位数字,如下所示:

for i in *
do
    echo "$i" | grep -qE "^[[:digit:]]{2,5}x[[:digit:]]{2,5}.*" && mv "$i" images
done

答案3

mv $(ls | grep YOUR_REGEX) 目的地目录/

应该能解决问题

干杯

相关内容