2012-01-02 2 views
0

Мне нужна ваша помощь с коротким сценарием bash. У меня есть папка, содержащая около 150 000 (!) Xml-файлов. Мне нужен скрипт, который извлекает все эти файлы, содержащие указанную строку. Сценарий должен работать как можно быстрее, потому что сценарий должен использоваться очень часто.bash script получить файлы в подпапках, которые содержат специальную строку

Мой первый подход был следующим, используя Grep:

for f in temp/* 
do 
    if grep "^.*the line which should be equal.*$" "$f" 
    then 
     echo "use this file" 
    else 
     echo "this file does not contain the line" 
    fi 
done 

Этот подход работает, но это занимает слишком много времени. Кто-нибудь знает более быстрый подход? Если другой язык сценариев является лучшим выбором, это также нормально.

С наилучшими пожеланиями, Майкл

+2

Всегда избегать исполняющих «командной за файл», если это вообще возможно; это неизбежно медленнее, чем наличие одного командного процесса во многих файлах. –

ответ

3

Вы можете использовать Grep без каких-либо обработчиков Баш.

-l, --files-with-matches 
      Suppress normal output; instead print the name of each input file from which output would normally have been printed. The scanning will stop on the first match. (-l is 
      specified by POSIX.) 

Итак, попробуйте следующее:

grep "the line which should be equal" --files-with-matches temp/* 
+0

150k файлов может быть слишком много для аргументов, если вы нажмете на слишком длинный список «Аргумент списка», прочтите следующее: http://mywiki.wooledge.org/BashFAQ/095 –

+0

Спасибо, он отлично работает :) – Michael

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