为什么在循环目录时使用 pdftotext 时会收到间歇性 I/O 错误,提示“无法打开文本文件”?

为什么在循环目录时使用 pdftotext 时会收到间歇性 I/O 错误,提示“无法打开文本文件”?

我有一个带有循环的 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

相关内容