仅调整具有特定图案的图像的尺寸

时间:2018-10-02 16:17:26

标签: regex linux bash shell

我有一个包含一些博客图像的目录。现在,我正在寻找一种仅对具有生成的uuid的图像进行批量调整大小的方法。它们具有固定的结构,因此似乎是一种很好的模式。

如何调整这些文件的大小,而不能排除其他所有文件的大小?

mogrify -resize 600 *.png


eeafc286-ac2c-4bed-9e9b-d7d3c55e5965.png
ef0318d2-d3e2-42c2-a45e-8ededbb947ed.png
efcd681e-2c12-4a5a-ac77-5d6bf0a76810.png
error.png
f35a14cf-4b3d-4fc3-a8d3-6ea59a059a36.png
f4b60929-47c3-4b56-9486-e5efd62dc2e8.png
f6b3c4bd-f5ba-4d1d-96dd-6c61d5444a03.png
f76e04a3-75f4-4139-b1c9-080fe1e9fea4.png
fc141aa9-1d49-401f-a38a-734f7b0c142f.png
fdfff9df-2dab-4110-bd2f-b65635a5cb21.png
john.jpg
site_1.png
site_2.png
tech.jpg

4 个答案:

答案 0 :(得分:1)

我可能会选择*-*-*-*-*png,但是如果要具体一点,可以使用glob进行粗略匹配,使用regex进行精细匹配:

for file in *.png
do
    [[ $file =~ ^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}\.png$ ]] || continue
    mogrify -resize 600 "$file"
done

答案 1 :(得分:0)

如果要使用文件遍历来匹配确切的模式,可以执行以下操作:

mogrify -resize 600 [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f].png

答案 2 :(得分:0)

我会尝试使用这种方法:

  • 计算与所需文件完全匹配的最佳正则表达式
  • 将其用作find参数首先找到要修改的文件
  • 然后,遍历文件列表并调用mogrify

样本squeleton看起来像这样:

files=$( find -regexp "$pattern" )
for file in "$files"; do
  mogrify "$file" ;
done

或更短的find -exec

# Note: not tested, valid mogrify arguments must be added/handled
# call mogrify for each 'find' results
find -regexp "$pattern" -exec mogrify {} +;
# call mogrify in a subshell for each 'find' results, for finest argument handling
find -regexp "$pattern" -exec sh -c 'mogrify "$@"' {} +;

您将必须在这里“玩弄参数传递和顺序”才能使命令起作用。

注意1:此答案不是关于“哪种模式最适合您的需求”问题,而是关于“查找自定义文件并对其执行命令”的更一般的方法。
注意2:我的答案不包含经过测试和验证的命令,而是使用findfind -exec的方法。

(建设性的)反馈意见很受欢迎。

答案 3 :(得分:0)

有百万种方法可以做到这一点。最安全的方法是仅ls |grep "yourpattern" > toprocess验证文件正确,然后cat toprocess| while read line; do mogrify -resize 600 $line"; done