2014-06-13 151 views
0
#! /bin/bash 

while : 
do 
    filenames=$(ls -rt *.log | tail -n 2) 
    echo $filenames 
    cat $filenames > jive_log.txt 
    sleep 0.1 
done 

我想从目录中读取最新的2个文件并使用bash加入它们。 但是,当前目录中不存在具有扩展名.log的文件时,命令ls -rt *.log将失败,并显示error "ls: cannot access *.log: No such file or directory"。出现错误后,它看起来像while循环没有执行。 之后我该怎么做,即使一个命令失败,无限循环也会继续。bash继续执行命令失败

+1

忽略错误使用'filenames = $(ls -rt * .log 2>/dev/null | tail -n 2)' – anubhava

+0

1.)使用'find'而不是'ls'。 2.)仅当使用[errexit](https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html)选项set -e时,Bash才会退出。 3.)使用'set -x'来调试你的脚本。 – ceving

+0

我正在使用ls -rt,这样我就可以得到2个最新的文件。我想find不支持这个。另外,尝试设置+ E,但仍然没有工作。 – Vinay

回答

1

我不知道你的意思,但也许是:

for ((;;)); do 
    while IFS= read -r FILE; do 
     cat "$FILE" 
    done < <(exec ls -rt1 *.log | tail -n 2) >> jive_log.txt 
    sleep 1 
done 

注意ls选项-1它通过行打印出的文件一致。

总之可以加入最后两个文件到jive_log.txt:

while IFS= read -r FILE; do 
    cat "$FILE" 
done < <(exec ls -rt1 *.log | tail -n 2) >> jive_log.txt 

另一种方法是将其保存到一个数组(例如,用readarray)然后传递最后2个元素猫。

readarray -t FILES < <(exec ls -rt1 *.log) 
cat "${FILES[@]:(-2)}" > jive_log.txt ## Or perhaps you mean to append it? (>>) 
+0

“done <(exec ls -rt1 * .txt | tail -n 2)>> jive_log.txt”引发错误。语法错误附近的意外标记'<(exec ls -rt * .log | tail -n 2)' – Vinay

+0

是的,我忘了添加另一个'<'。请参阅更新。 – konsolebox

1

如果你想的find输出进行排序,你必须添加开头,以后可以在删除一个排序键。

find . -name \*.log -printf '%T+\t%p\n' | 
sort -r | 
head -2 | 
cut -f 2- 

使用head代替tail是有点便宜。