2016-11-30 17 views
0

同じ名前のファイルと競合するファイルがあるかどうかを確認しています。bashスクリプトは、ファイル名と文字列を比較すると "No such file or directory"と表示します

FILEPATH=/root/logs/pData*.csv 
COMPPATH=/root/logs/pData*.csv.gz 
shopt -s nullglob 
thisYear="$(date +"%Y")" 
thisMonth="$(date +"%m")" 
thisDay="$(date +"%d")" 
thisTime="$(date | cut -d ' ' -f 4 | tr : _)" 

for file in $FILEPATH 
do 
    fileYear="$(stat -c %y $file | cut -d'-' -f 1)" 
    fileMonth="$(stat -c %y $file | cut -d'-' -f 2)" 
    fileDay="$(stat -c %y $file | cut -d'-' -f 3 | cut -d' ' -f 1)" 
    fileTime="$(stat -c %y $file | cut -d ' ' -f 2 | cut -d '.' -f 1 | tr : _)" 

    if (("$fileYear" < '1990')) 
      then 
        fName="pData_"$thisYear"_"$thisMonth"_"$thisDay"_"$thisTime".csv.gz" 
      else 
        fName="pData_"$fileYear"_"$fileMonth"_"$fileDay"_"$fileTime".csv.gz" 
    fi 

    echo $fName 

    for file in $COMPPATH 
    do 
      if ('/root/logs/'$fName == $file) 
        then 
          echo "OOPS" 
      fi 
    done 
done 

大部分が意図したとおりのスクリプトは、私は同じ名前のファイルに実行したときOOPSを印刷し、動作しますが、これはなぜ存在しないファイルのために、それは

./compress.sh: line 31: /root/logs/pData_2015_09_18_22_25_44.csv.gz: No such file or directory 

を印刷します印刷された?

これを防ぐにはどうすればよいですか?

+0

ほかJamie Wが与えた(正しい)答えに、あなたのコードをhttp://shellcheck.net/で実行し、見つかったものをすべて修正することを検討してください。 –

答えて

1

文字列比較が間違っています。単一括弧を使用すると、サブシェルを作成し、実行しようとしている「/ルート/ログ/」$ fNameを

設定し、あなたの文字列があることを比較します。

if [[ '/root/logs/'$fName = $file ]]

参照:http://www.tldp.org/LDP/abs/html/comparison-ops.html

+0

注: '[-a" fileName "]'を実行して、ファイルが存在するかどうかを確認することもできます... –

+0

オリジナルの提案はエラー出力を取り除かず、OOPSは決して印刷されません。 – jasper

+0

ABSは、非常に貧しい参照の選択です - JavaScriptの世界のW3Schoolsと比較することができます。公式のbashマニュアルページ、bash-hackers wiki、またはWooledge wikiのいずれかを使用することを検討してください。これらはすべて、最新の状態に保ち、例の悪い習慣を避けるのに適しています。 –

関連する問題