Bash脚本遍历子目录执行pdfimages命令及文件获取问题
解决Bash遍历子目录处理PDF文件的问题
你的目录结构为每个子目录下存放一个同名PDF文件:
x (文件夹) x.pdf (文件) y y.pdf ...
需要用pdfimages -j x.pdf x命令,将每个子目录中的PDF转换为同名带序号的图片文件(如x-001.jpg),但之前的脚本报错I/O Error: Couldn't open file '*.pdf': No such file or directory,问题出在脚本没有正确定位到子目录内的PDF文件,以下是两种可行的解决方法:
方法一:使用find命令(推荐)
通过find直接定位所有子目录中的PDF文件,再执行处理命令:
find . -type f -name "*.pdf" -exec sh -c ' pdf_dir=$(dirname "$1") pdf_base=$(basename "$1" .pdf) cd "$pdf_dir" && pdfimages -j "$1" "$pdf_base" ' sh {} \;
find . -type f -name "*.pdf":查找当前目录下所有后缀为pdf的文件- 用
sh -c包裹处理逻辑:先获取PDF所在目录和不带后缀的文件名,进入对应目录后执行pdfimages,确保生成的图片存放在PDF所在的子目录中
方法二:使用for循环遍历子目录
手动遍历每个子目录,进入目录后处理PDF文件:
单PDF子目录场景
如果每个子目录只有一个PDF文件,可使用:
for dir in */; do cd "$dir" || continue # 进入子目录,失败则跳过 pdf_file=$(ls *.pdf) base_name="${pdf_file%.pdf}" pdfimages -j "$pdf_file" "$base_name" cd .. # 返回上级目录 done
多PDF子目录场景
如果子目录中可能存在多个PDF文件,调整为遍历每个PDF:
for dir in */; do cd "$dir" || continue for pdf_file in *.pdf; do [ -f "$pdf_file" ] || continue # 避免无PDF时匹配到"*.pdf"字符串 base_name="${pdf_file%.pdf}" pdfimages -j "$pdf_file" "$base_name" done cd .. done
内容的提问来源于stack exchange,提问作者ppr
相关产品推荐
相关产品推荐

