pdftotextを使用して多くのPDFファイルをテキストに変換するループを持つbashスクリプトがあります。コードの関連部分は次のとおりです。
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-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