От нескольких grep до 1 grep?Должен ли я изменить это и как мне это сделать?

StackOverflow https://stackoverflow.com/questions/1614035

  •  06-07-2019
  •  | 
  •  

Вопрос

Это мой окончательный сценарий

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.или .гг.

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

Это было полезно?

Решение

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

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

Вы не можете.

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

[^()~$|.oex]

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

Другие советы

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

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

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

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

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

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

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

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

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

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

find * -regex 'include-pattern' -a ! \( -name .svn -o -name "*tab*" \)

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

find . \( -name ".*" -prune \) -or \
    -name "*.exe" -or -name "*.o" -or -name "*~" \
    -print0 | xargs -0 svn add

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

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

grep -v -e "\.svn" -e ".tab." -e ".yy."
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top