2015-11-11 2 views
0

Мой код принимает добавленные, измененные, удаленные, переименованные, скопированные файлы с git status -s и сравнивает их со списком путей файла из файла.GREP: исключить расширения файлов в определенном каталоге

git status -s | 
grep -E "^M|^D|^A|^R|^C" | 
awk '{if ($1~/M+/ || $1~/D+/ || $1~/A+/ || $1~/R+/ || $1~/C+/) print $2}' | 
grep --file=$list_of_files --fixed-strings | 
grep -r --exclude="*.jar" "SVCS/bus/projects/Resources/" 
  1. Печатает статус мерзавец как M foo.txt
  2. делает некоторые «Фильтрация» операций
  3. Более фильтрующие операции
  4. принимает путь к файлам для сравнения из текстового файла
  5. Здесь я пытаюсь сделать так, чтобы последний шаг исключил .jar файлов из определенного каталога.

Как я могу сделать последний шаг? Или нужно добавить что-то к 4-му шагу?

+1

Поскольку у вас много, много труб, я думаю, что это, вероятно, можно обрабатывать в одном процессе. Пожалуйста, отправьте образец вывода «git status -s» с окончательным желаемым выходом. – fedorqui

+0

Я не уверен, почему у вас есть флаг '-r' в последнем' grep', но я могу что-то упустить; как насчет try '| grep -vE "SVCS/bus/projects/Resources/*. jar" 'как последняя команда вместо текущего' grep'? –

+0

Часть до 'awk' может быть:' git status -s | awk '$ 1 ~/M | D | A | R | C/{print $ 2}' '.. Что такое содержимое' $ list_of_files'? – hek2mgl

ответ

0

Простого исправление изменить последнюю строку

grep -v 'SVCS/bus/projects/Resources/.*\.jar$' 

но что на самом деле какой-то ужасный код у вас там.

Имея в виду, что grep | awk и awk | grep - antipattern, как насчет этого рефакторинга?

git status -s | 
grep -E "^M|^D|^A|^R|^C" | 
awk '{if ($1~/M+/ || $1~/D+/ || $1~/A+/ || $1~/R+/ || $1~/C+/) 

... Подождите, в чем смысл? grep уже убедился, что $1 содержит одну или несколько букв. Коэффициент + здесь полностью избыточен.

print $2}' 

Будет разбит на файлы с пробелами в них. Это очень распространенная ошибка, которая усугубляется, потому что много времени программист знал, что это сломается, но просто подумал: «здесь не может быть».

git status -s | awk 'NR==FNR { files[$0] = 1; next } 
    /^[MDARC]/ { gsub(/^[MDARC]+ /, ""); 
     if ($0 ~ /SVCS\/bus\/projects\/Resources\/.*\.jar$/) 
      next; 
     if ($0 in files) print }' "$list_of_files" - 

NR==FNR вещи является общей идиомой, чтобы прочитать первый файл в массив, а затем падает до следующего входного файла. Итак, мы читаем $list_of_files в ключи ассоциативного массива files; то, если имя файла, которое мы читаем от git status, присутствует в ключах, мы печатаем его. Условие пропускать файлы .jar в определенном пути является простым дополнением к этому сценарию Awk.

Предполагается, что $list_of_files действительно представляет собой список фактических файлов, предложенных по имени файла. Ваш код будет искать соответствие в любом месте этого файла, поэтому также будет совпадать имя частичного файла (например, если файл содержит path/to/ick, файл с именем somepath/to/icktys/mackerel будет соответствовать и, следовательно, будет напечатан). Если это назначенная функциональность, приведенный выше сценарий потребует некоторых довольно резких изменений.

+0

Этот код выводит из 'git status -s' exmp:' M Boo.txt' или 'M Far.t' и отрывает путь к файлу или файлу. После этого grep берет его и сравнивает с путём к файлам из файла. Теперь, за исключениями, спасибо вам) И спасибо за ваше объяснение, я не смог найти его в Интернете. А также для того небольшого вашего гида, который преувеличивает мой код! –

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