2013-05-14 101 views
2

我在這裏搜索過,但仍無法找到我的通配問題的答案。在bash腳本中防止通配符擴展

我們有文件「file.1」到「file.5」,如果我們的隔夜處理正常,每個文件都應該包含字符串「completed」。

我認爲這是一件好事,首先檢查是否有一些文件,然後我想grep他們看我是否找到5「完成」的字符串。下面無辜的方法是行不通的:

FILES="/mydir/file.*" 
if [ -f "$FILES" ]; then 
    COUNT=`grep completed $FILES` 
    if [ $COUNT -eq 5 ]; then 
     echo "found 5" 
else 
    echo "no files?" 
fi 

感謝您的任何意見....萊爾

+0

您的意思是'COUNT = \'grep的完成 '$文件' | wc -l \'' – 2013-05-14 00:11:26

+1

看起來真正的問題是如何計算文件,而不是如何防止通配符擴展。正確?你會反對改變主題(或讓別人改變它)嗎? – 2013-05-14 00:21:32

回答

3

http://mywiki.wooledge.org/BashFAQ/004,以計算文件的最好方法是使用一個數組(與nullglob選項) :

shopt -s nullglob 
files=(/mydir/files.*) 
count=${#files[@]} 

如果要收集這些文件的名稱,你可以做到這一點,像這樣(假設GNU的grep):

completed_files=() 
while IFS='' read -r -d '' filename; do 
    completed_files+=("$filename") 
done < <(grep -l -Z completed /dev/null files.*) 
((${#completed_files[@]} == 5)) && echo "Exactly 5 files completed" 

這種方法有些冗長,但保證即使使用非常不尋常的文件名也能正常工作。

0

你可以這樣做是爲了防止通配符:

echo \'$FILES\' 

但似乎你有一個不同的問題

2

試試這個:

[[ $(grep -l 'completed' /mydir/file.* | grep -c .) == 5 ]] || echo "Something is wrong" 

將打印「有些事情不對」,如果沒有按找不到5 completed行。

更正缺少的 「-l」 - 解釋

$ grep -c completed file.* 
file.1:1 
file.2:1 
file.3:0 

$ grep -l completed file.* 
file.1 
file.2 

$ grep -l completed file.* | grep -c . 
2 

$ grep -l completed file.* | wc -l 
    2 
+1

'grep |有什麼意義? grep -c',而不是一個'grep -c'? – 2013-05-14 00:27:23

+0

@CharlesDuffy查看編輯 – jm666 2013-05-14 00:39:03