Multi grep до 1 grep? Должен ли я изменить это и как я? - PullRequest
1 голос
/ 23 октября 2009

Это мой последний сценарий

find -regex "^\..*[^(~$|\.o$|\.exe)]" | grep -v "\.svn" | grep -v ".tab." | grep  -v ".yy." | xargs svn add 2>/dev/null

Для тестирования я не хочу добавлять его в SVN, поэтому я использую

find -regex "^\..*[^(~$|\.o$|\.exe)]" | grep -v "\.svn" | grep -v ".tab." | grep  -v ".yy."

ПРИМЕЧАНИЕ. Я хотел игнорировать файлы, начинающиеся с '.' (в текущей и вложенных папках), но не мог понять, как я согласился на .svn

Я попытался удалить лишние greps для создания одного регулярного выражения, но я не мог заставить его игнорировать .svn (или .FILE) в текущих и вложенных папках и не мог игнорировать .tab или .гг.

Одна проблема в том, что я не мог понять, как сделать ^. (игнорировать, если начать с?) работать. Я уверен, что одной проблемой является тот факт, что я делаю. * Который будет игнорировать мой .tab. править, и я не уверен, как обойти.

Ответы [ 5 ]

3 голосов
/ 23 октября 2009

Ваша основная проблема в том, что вы думаете, что можете сделать это:

[^(~$|\.o$|\.exe)]

Вы не можете.

В классе символов (это то, что у вас есть здесь) вы можете включать (или исключать) отдельные символы, но вы не можете писать выражения там. Вышесказанное эквивалентно (что касается механизма регулярных выражений):

[^()~$|.oex]

Я нахожусь в Windows, поэтому я не могу дать вам проверенную команду, и ваш пост оставляет меня немного озадаченным, какие файлы вам действительно нужны. Так что это означает правильное направление в отношении вашего неправильного представления о регулярном выражении.

2 голосов
/ 23 октября 2009

ПРИМЕЧАНИЕ. Я хотел игнорировать файлы, начинающиеся с '.' (в текущей и вложенных папках), но не мог понять, как я согласился на .svn

Одна проблема, я не мог понять, как сделать ^. (игнорировать, если начать с?) работать. Я уверен, что одной проблемой является тот факт, что я делаю. * Который будет игнорировать мой .tab. править, и я не уверен, как обойти.

Тест -regex на find применяется к полному пути, а не только к имени файла. Со страницы руководства:

Например, чтобы сопоставить файл с именем «./fubar3», вы можете использовать регулярное выражение «. * Bar.» или '. * b. * 3', но не 'f. * r3'.

ответ soulmerge предоставляет один из способов привести все ваши условия в утверждение поиска; Вы также можете сделать это с чем-то вроде

find * -regex 'include-pattern' -a ! \( -regex 'exclude-pattern' [-o 'exclude-pattern2' ...] \)

Если вы хотите объединить несколько шаблонов для исключения, будь то в вашем потоке или в регулярных выражениях find, просто используйте или:

grep -v '\.svn\|.tab.\|.yy.'
egrep -v '\.svn|.tab.|.yy.'

Обратите внимание, что очень и очень хорошая идея использовать одинарные кавычки для регулярных выражений - вам не нужно, чтобы $ пытался раскрыть переменную.

Edit: Те исключающие шаблоны, которые вы предлагаете, на самом деле не должны быть регулярным выражением. Вы можете получить их только с -name, которое соответствует только фактическому имени, а не всему пути.

find * -regex 'include-pattern' -a ! \( -name .svn -o -name "*tab*" \)
1 голос
/ 23 октября 2009

Вы можете указать find игнорировать определенные папки и их содержимое с помощью -prune. И здесь вам не нужно регулярное выражение, других команд поиска вполне достаточно. Если вы хотите иметь возможность обрабатывать имена файлов с пробелами, я бы дополнительно использовал -print0. Подводя итог, это должно делать то, что вам нужно:

find . \( -name ".*" -prune \) -or \
    -name "*.exe" -or -name "*.o" -or -name "*~" \
    -print0 | xargs -0 svn add
0 голосов
/ 24 октября 2009

Grep поддерживает несколько шаблонов. E.g.:

grep -v -e "\.svn" -e ".tab." -e ".yy."
0 голосов
/ 23 октября 2009

Я не уверен на 100%, чего вы хотите достичь, но find -regex '^.*/[^.].*' должно работать (соответствует любому не точечному символу в начале имени).

...