使用带有正则表达式的查找来执行 for 循环

using find with regex to execute a for loop

我正在尝试查找具有模式 q[0-9]+[0-9]+[a-z]+.JPG 的所有文件,并且对于找到的每个文件执行 convert (imagemagick) 在每个文件上找到 fooq[0-9]+[0-9]+[a-z]+.pdf[=20= 的输出]

这是我的脚本:

#!/bin/bash

i=1
find . -type f -regex './q[0-9]+[0-9]+[a-z]+.JPG' -exec bash -c 'for j; do convert "$j" q$((i++)).pdf; done' "$targetfile" {} +

找不到文件,即使我将命令更改为:

#!/bin/bash

i=1
find . -type f -regex './q[0-9a-z]*.JPG' -exec bash -c 'for j; do convert "$j" q$((i++)).pdf; done' "$targetfile" {} +

为了测试 find 命令(在本例中有效)文件未按正确顺序转换。看起来我需要在某处插入 sort 但我不确定该怎么做。文件名如下所示:

q1a.JPG
q7b.JPG
q11g.JPG

输出文件名应如下所示:

fooq1a.pdf
fooq7b.pdf
fooq11g.pdf

我会怎样

  1. 创建正确的正则表达式
  2. sort 添加到我的脚本中

如果您有比我更好的解决方案,请随时分享。干杯!

find默认使用的regex基本上就是EMACS正则表达式。如果需要,您可以使用 -regextype <type> 选项将正则表达式的类型调整为 find。但是,在给定文件名的情况下,只要您的文件名相对一致,就可以使用默认正则表达式使用简单的模式匹配。要处理示例中的文件名,您可以执行以下操作:

while read -r name; do 
    fname=$(basename "$name")
    convert "$name" "$(dirname "$name")/foo${fname/JPG/pdf}"
done < <(find ./ -type f -name 'q[0-9]*JPG')

(这假定 JPG 扩展名 并且您没有 JPG 作为文件名的一部分再次出现)

例如,要输出正在发生的事情,您可以简单地用 echoprintf 代替 convert 进行测试。一个简短的例子是:

#!/bin/bash

while read -r name; do 
    fname=$(basename "$name")
    printf "convert %s %s\n" "$name" "$(dirname "$name")/foo${fname/JPG/pdf}"
done < <(find ./ -type f -name 'q[0-9]*JPG')

输出

$ bash cvttopdf.sh
convert ./q11g.JPG ./fooq11g.pdf
convert ./q1a.JPG ./fooq1a.pdf
convert ./q7b.JPG ./fooq7b.pdf

sort,您无需将sort作为转换的一部分。要按排序顺序查看文件,您可以简单地按排序顺序查看,使用 ls 或更详细的 sort 调用的常规工具之前或之后。如果您在转换过程中还有其他排序需求,请放下并注意,我会尝试进一步提供帮助,我只是有点困惑将 jpeg 转换为 pdf 的目的是什么?