使用带有正则表达式的查找来执行 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
我会怎样
- 创建正确的正则表达式
- 将
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
作为文件名的一部分再次出现)
例如,要输出正在发生的事情,您可以简单地用 echo
或 printf
代替 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 的目的是什么?
我正在尝试查找具有模式 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
我会怎样
- 创建正确的正则表达式
- 将
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
作为文件名的一部分再次出现)
例如,要输出正在发生的事情,您可以简单地用 echo
或 printf
代替 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 的目的是什么?