我想要的功能是寻找当前目录及子目录下所有与传入的分辨率相同的图片的地址。
环境
- Windows
- Git Bash + MinGW
思路
- 用 find 找到所有后缀名为 png 的文件的相对路径
- 把结果写到一个 temp 文件里
- 用 read 读取 temp 文件每一行,以一行一行处理相对路径
- 使用 file 获得对应路径的图片文件的信息
- 使用 awk 得到其中的分辨率字段
- 如果分辨率正确,打印相对路径
问题
然而,实际根本无法使用……虽然只有这么一点功能,但是架不住我要找的目录里图片多啊……差不多有 10g 了……第一版直接用不了,我调试了一下,find 还是可以接受的,但是一行一行 awk 太慢了,我尝试了多线程和回溯,勉强可以出结果了,但是我觉得不应该这么慢的,可能是我太菜了……毕竟我甚至不知道怎么把 find 的结果直接在内存中处理,甚至需要写到文件中的……
代码
#!/usr/bin/env bash
set -euo pipefail
if [[ $# != 2 ]]; then
echo bad argument.
exit 1
fi
TEMP_FILE=".todo.find"
find . -name "*.png" >>${TEMP_FILE}
while read line; do
{
resolution=$(file "${line}" | awk -F ',' '{print $2}')
width=$(echo ${resolution} | awk '{print $1}')
[[ ${width} != $1 ]] && continue
height=$(echo ${resolution} | awk '{print $3}')
if [[ ${height} == $2 ]]; then
echo ${line}
fi
} &
done <${TEMP_FILE}
rm ${TEMP_FILE}
需求
总之希望有大佬指点一下怎么优化这个脚本!万分感谢!!!