Как я могу пройти через дерево каталогов, используя bash или Perl скрипт - PullRequest
2 голосов
/ 09 июля 2009

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

Это будет выглядеть так:

  • Перейдите по большой структуре файлов и папок с каталогом unix.
  • Если содержимое текущего файла содержит строку, которая соответствует одному или нескольким выражениям регулярного выражения,
  • Затем добавьте полный путь к текстовому файлу результатов.

Сценарии Bash или Perl хороши, хотя я бы предпочел, чтобы вы делали это, используя сценарий bash с командами grep , awk и т. Д.

Ответы [ 6 ]

8 голосов
/ 09 июля 2009
find . -type f -print0 | xargs -0 grep -l -E 'some_regexp' > /tmp/list.of.files

Важные части:

  • -type f делает список поиска только файлами
  • -print0 печатает файлы, разделенные не \ n, а \ 0 - это здесь, чтобы убедиться, что это будет работать, если у вас есть файлы с пробелами в их именах
  • xargs -0 - разбивает ввод на \ 0 и передает каждый элемент в качестве аргумента введенной вами команде (grep в этом примере)

Крутая вещь при использовании xargs заключается в том, что если в вашем каталоге действительно много файлов, вы можете ускорить процесс, распараллелив его:

find . -type f -print0 | xargs -0 -P 5 -L 100 grep -l -E 'some_regexp' > /tmp/list.of.files

При этом команда grep будет запускаться в 5 отдельных копиях, каждая из которых сканирует другой набор до 100 файлов

5 голосов
/ 09 июля 2009

используйте find и grep

find . -exec grep -l -e 'myregex' {} \; >> outfile.txt

-l на grep получает только имя файла

-e на grep указывает регулярное выражение

{} помещает каждый файл, найденный командой find, в конец команды grep

>> outfile.txt добавляет текстовый файл

2 голосов
/ 10 июля 2009

Если вы хотите сделать это из Perl, вы можете взять команды find, которые предложили люди, и превратить их в скрипт Perl с find2perl:

Если у вас есть:

$ find ...

сделай это

$ find2perl ...

Это выводит программу Perl, которая делает то же самое. Оттуда, если вам нужно сделать что-то более простое в Perl, но сложное в оболочке, вы просто расширяете программу Perl.

2 голосов
/ 09 июля 2009

grep -l -R <regex> <location> должен сделать работу.

0 голосов
/ 09 июля 2009
find /path -type f -name "outfile.txt" | awk '
{
    while((getline line<$0)>0){
        if(line ~ /pattern/){
            print $0":"line
        }
    }    
}'
0 голосов
/ 09 июля 2009
find /path -type f -name "*.txt" | awk '
{
    while((getline line<$0)>0){
        if(line ~ /pattern/){
            print $0":"line
            #do some other things here
        }
    }    
}'

аналог нить

...