2016-11-30 84 views
0

我正在檢查,看看我希望創建一個文件與具有相同名稱的文件發生衝突。bash腳本打印「沒有這樣的文件或目錄」比較文件名字符串

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

字符串比較錯誤。使用單括號是創建一個子shell並試圖執行 '/根/日誌/' $ 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維基或Wooledge wiki--所有這些都更好地保持最新狀態並避免在其示例中出現不良做法。 –

相關問題