2014-01-09 39 views
0

該循環中的問題是什麼?bash腳本編寫中的日期比較

while read result 
do 
    filenames[ $j ]="$result" 
    filedates[ $j ]=$(stat -c %y ${filenames[ $j ]} | cut -d ' ' -f1) 

    ((j++)) 
done << (ls -t *.gz) 

我收到此錯誤:

script.sh: line 13: syntax error near unexpected token `(' 
script.sh: line 13: `done << (ls -t *.gz)' 
+1

根本不清楚你的意思。 file2到file5中的每一個都是相同的年齡,比file1早5天?你想做什麼? –

回答

1

假設你有GNU的coreutils:

stat -c "%Y %n" * | awk '{print $2, (prev ? (prev-$1)/86400 " days" : ""); prev=$1}' 

鑑於這些文件:

touch file1.tar.gz 
touch -t 01041200 file2.tar.gz 
touch -t 1312311200 file3.tar.gz 
touch -t 1312261200 file4.tar.gz 
touch -t 1312211200 file5.tar.gz 

輸出:

$ stat -c "%Y %n" * | awk '{print $2, (prev ? (prev-$1)/86400 " days" : ""); prev=$1}' 
file1.tar.gz 
file2.tar.gz 5.18753 days 
file3.tar.gz 4 days 
file4.tar.gz 5 days 
file5.tar.gz 5 days 
+0

非常感謝這就是做工精細 最終問題請 現在用這個循環 同時讀取結果 做 文件名[$ J] = 「$結果」 文件日期[$ J] = $(統計-c%Y $ {文件名[$ J]} |切-d '' -f1) ((J ++)) 做過<<(LS -t *。廣州) 我得到這個錯誤 script.sh:行12:語法錯誤(' script.sh:第12行:'完成<<(ls -t * .gz)' – user3178889

+0

您無法在格式化代碼中發佈評論:請更新問題 –

+0

我做了那個先生謝謝您 – user3178889

2

它看起來像你試圖使用Process substitution,但不完全正確。

您需要:

while read result 
do 
    filenames[ $j ]="$result" 
    filedates[ $j ]=$(stat -c %y ${filenames[ $j ]} | cut -d ' ' -f1) 
    ((j++)) 
done < <(ls -t *.gz) 

注意在間隔上done線的關鍵差異。你重定向一個單一的<;然後使用<(...)進行過程替換。使用<<表示代碼正在查找「here文檔」。