使用pandoc批量转换epub/pdf等文件为txt时shell脚本执行异常问题
问题原因
你原有脚本的执行逻辑是将未修改的原始命令字符串输出后,再通过管道交给sed做替换修改,所以你直接把echo替换为eval时,eval执行的是还没做后缀修改的原始命令,自然达不到转换效果,相当于直接读写原文件。同时原有写法用ls遍历文件名、多轮sed修改字符串的方式,也容易在遇到带空格、特殊字符的文件名时出现解析错误。
解决方法
方法1:最小修改原有脚本
你原有脚本输出的命令本身是正确的,只需要在整个脚本的末尾加上管道交给bash执行即可,不需要修改内部的echo:
ls $1 | while read x; do echo "pandoc '$x' -o $x" | sed 's/\.[^.]*$//' | sed 's/$/.txt/' | sed 's/$/ --wrap=preserve/' ; done | bash
方法2:更稳健的改写方案
用shell内置的参数替换实现,不需要调用sed、也不需要解析ls输出,兼容性和效率更高:
#!/bin/bash # 遍历指定目录下的文件,可自行修改通配符仅匹配指定格式,比如 "$1"/*.epub "$1"/*.pdf for file in "$1"/*; do # 跳过目录,仅处理文件 [ -f "$file" ] || continue # 内置参数替换去掉文件后缀 filename_no_suffix="${file%.*}" # 执行转换 pandoc "$file" -o "${filename_no_suffix}.txt" --wrap=preserve done
注意:如果需要转换PDF文件,需要先安装poppler工具包:Debian/Ubuntu执行
apt install poppler-utils,CentOS/RHEL执行yum install poppler-utils,否则pandoc无法解析PDF内容。
内容的提问来源于stack exchange,提问作者Hmm
相关产品推荐
相关产品推荐

