bash脚本中的日期比较

时间:2014-01-09 20:50:25

标签: 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)'

2 个答案:

答案 0 :(得分: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行间距的重要差异。您使用单个<重定向;然后使用<(...)进行流程替换。使用<<表示代码正在查找“此处文档”。

答案 1 :(得分: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