0

テキスト ファイルに存在するファイル名がフォルダーに存在するかどうかを確認するバッチ ファイルを作成しようとしています。すべてのファイル名を保存する PRAS_filelist.txt という名前のテキスト ファイルがある PAN というフォルダーがあります。そして、すべてのファイルが存在する PRAS フォルダー。

私の要件は、フォルダーをスキャンし、最後に PRAS_PP_ERROR_LOG ファイルにエラー メッセージを入力することです。しかし、exitを使用したため、ファイルが1つも存在しない場合は出てきます。

以下はコードです

`rm -f ../SessLogs/PRAS_PP_ERROR_LOG`
for i in `cat ./PAN/PRAS_filelist.txt`
do
    file_name=$i
    if [ -e ./PAN/PRAS/"$file_name"_* ]
    then
        if [ -s ./PAN/PRAS/"$file_name"_* ]
        then
            a=`sed -n '1p' ./PAN/PRAS/"$file_name"_*|cut -d'|' -f1`
            b=`sed -n '$p' ./PAN/PRAS/"$file_name"_*|cut -d'|' -f1`
            if [ "$a" == "H" ] && [ "$b" == "T" ]
            then
                trailer_record=`sed -n '$p' ./PAN/PRAS/"$file_name"_*|cut -d'|' -f2`
                record_count=`wc -l ./PAN/PRAS/"$file_name"_*|cut -d' ' -f1`
                r_c=`expr $record_count - 1`
                if [ $trailer_record -eq $r_c ]
                then
                    `cp ./PAN/PRAS/"$file_name"_* ./PAN/PRAS/STANDARDIZE/"$file_name"`
                    `sed -i '$d' ./PAN/PRAS/STANDARDIZE/"$file_name"`
                else 
                    echo "ERROR in file $file_name: Count of records is $r_c and trailer is $trailer_record">../SessLogs/PRAS_PP_ERROR_LOG  
                fi  
            else
                echo "ERROR in file $file_name: header or trailer is missing">../SessLogs/PRAS_PP_ERROR_LOG
                exit 1 
            fi 
        else
            echo "ERROR in file $file_name: empty file">../SessLogs/PRAS_PP_ERROR_LOG
            exit 1
        fi
    else
        echo "ERROR: $file_name doesnot exist">../SessLogs/PRAS_PP_ERROR_LOG
        exit 1
    fi
done
4

1 に答える 1

0

コードを少しリファクタリングする:

奇妙な点の 1 つは、ファイル名のリストがあると主張しているのに、ファイルの存在を確認する前にアンダースコアを追加していることです。実際のファイル名には実際にアンダースコアがありますか?

#!/bin/bash
shopt -s nullglob

logfile=../SessLogs/PRAS_PP_ERROR_LOG
rm -f $logfile

while read file_name; do
    files=( ./PAN/PRAS/${file_name}_* )
    if (( ${#files[@]} == 0 )); then
        echo "ERROR: no files named ${file_name}_*"
        continue
    elif (( ${#files[@]} > 1 )); then
        echo "ERROR: multiple files named ${file_name}_*"
        continue
    fi

    f=${files[0]}

    if [[ ! -s $f ]]; then
        echo "ERROR in file $f: empty file"
        continue
    fi

    a=$(sed    '1q' "$f" | cut -d'|' -f1)
    b=$(sed -n '$p' "$f" | cut -d'|' -f1)

    if [[ "$a" != "H" || "$b" != "T" ]]; then
        echo "ERROR in file $f: header or trailer is missing"
        continue
    fi 

    trailer_record=$(sed -n '$p' "$f" | cut -d'|' -f2)
    r_c=$(( $(wc -l < "$f") - 1 ))

    if (( trailer_record == r_c )); then
        sed '$d' "$f" > ./PAN/PRAS/STANDARDIZE/"$file_name"
    else 
        echo "ERROR in file $f: Count of records is $r_c and trailer is $trailer_record"
    fi  

done < ./PAN/PRAS_filelist.txt | tee $logfile
于 2013-10-10T11:08:29.553 に答える