2014-06-13 150 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是有點便宜。