我有一个带有循环的 bash 脚本,它使用 pdftotext 将许多 pdf 文件转换为文本。以下是代码的相关部分:
cd /data/user/Data/Reports/pdf/
dirs=(A*/)
for directory in "${dirs[@]}"
do
cd "/data/user/Data/Reports/pdf/$directory"
files=(*.pdf)
mkdir -p "/data/user/Data/Reports/txt/$directory"
for file in "${files[@]}"
do
filePrefix=${file%.pdf}
saveFilename="/data/user/Data/Reports/txt/$directory/$filePrefix.txt"
pdftotext "$file" "$saveFilename"
done
done
大多数情况都是成功的,但其中许多都会给我一个类似以下的错误,并且不会创建文本文件:
I/O 错误:无法打开文本文件“/data/user/Data/Reports/txt/AAL-US/AAL-US5_032.txt”
当我直接在终端中提交以下内容时,pdf 会正确转换为 txt,没有任何问题:
pdftotxt /data/user/Data/Reports/pdf/AAL-US/AAL-US5_032.pdf /data/user/Data/Reports/txt/AAL-US/AAL-US5_032.txt
此错误的典型问题是我错误指定了文件路径,但我确信这里的情况并非如此,因为当我直接通过终端提交它时它会起作用。
为什么它对大多数文件转换有效而对某些文件转换失败?
任何指导将不胜感激。谢谢。
编辑:该错误似乎不会每次都发生在相同的文件上。这次,代码与 AAL-US 没有任何问题,就像我上面首先提到的错误一样。文本文件 ADSK-US8_032.txt 不存在。我只是尝试直接在终端中将此文件转换为文本,但它给了我同样的错误。文件系统中仍然有空间:inode 使用率为 54%,存储率为 60%。我一直在研究学校的 Linux 集群,我刚刚了解到该集群存在存储问题并给出“设备上没有剩余空间”错误 - 不确定这是否相关。
这是我昨晚运行的 stdout stderr 的摘录:
I/O 错误:无法打开文本文件 '/data/user/Data/Reports/txt/ADSK-US/ADSK-US8_032.txt' dirCounter=12/127;文件计数器=1919/1988;目录=ADSK-US/;文件名=ADSK-US8_032.pdf;持续时间=0;日期时间=06/24/20 22:31:31;
如果有帮助,这是我提交的完整代码:
cd /data/user/Data/Reports/pdf/
statusFile="/data/user/Projects/Reports/pdfTxtConversion/meta/pdf2textStatus.txt"
dirs=([A-C]*/)
totalDirs=${#dirs[@]}
dirCounter=1
for directory in "${dirs[@]}"
do
echo "-------------------------------------------"
echo "Processing directory $directory"
echo "-------------------------------------------"
cd "/data/user/Data/Reports/pdf/$directory"
if [ $? -ne 0 ]; then
echo "failed to cd to $directory from $PWD"
exit 1
fi
files=(*.pdf)
totalFiles=${#files[@]}
fileCounter=1
mkdir -p "/data/user/Data/Reports/txt/$directory"
for file in "${files[@]}"
do
startTime=`date +%s`
filePrefix=${file%.pdf}
saveFilename="/data/user/Data/Reports/txt/$directory$filePrefix.txt"
pdftotext "$file" "$saveFilename"
endTime=`date +%s`
conversionDuration=$((endTime-startTime))
msg="dirCounter=$dirCounter/$totalDirs; fileCounter=$fileCounter/$totalFiles; directory=$directory; filename=$file; duration=$conversionDuration; datetime=$(date +"%D %T");"
echo $msg >> $statusFile
echo $msg
((fileCounter++))
done
((dirCounter++))
done