2013-05-14 2 views
2

Я искал здесь, но все еще не могу найти ответ на мои проблемы с глотанием.предотвращение расширения подстановочных знаков в скрипте bash

У нас есть файлы «file.1» через «file.5», и каждый должен содержать строку «завершен», если наша обработка ночной обработки прошла нормально.

Я полагаю, что это хорошая вещь, чтобы сначала проверить, что есть некоторые файлы, а затем я хочу, чтобы 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 

Спасибо за любые советы .... Lyle

+0

вы имели в виду 'COUNT = \' Grep завершено '$ FILES' | wc -l \ '' –

+1

Похоже, что реальный вопрос заключается в том, как подсчитывать файлы, а не как предотвращать расширение подстановочных знаков. Верный? Не возражаете ли вы изменить тему (или кто-то другой изменит ее)? –

ответ

3

Per 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'? –

+0

@CharlesDuffy см. Редактирование – jm666

Смежные вопросы