Использование grep с флагом --exclude-dir для исключения нескольких каталогов

Если вы хотите проверить это аргумент функции эквивалентен некоторой строке, вы должны использовать конструкцию if ["$ x" == "строка"] , тогда ваш код будет выглядеть так:

test () {
  if [ "$1" == "toto" ] then
    return 1
  elif [ "$1" == "tata" ] then
    return 4
  fi
}

main () {
  test "tata"
  if [ $? -ne 1 ] then
    echo "somecode"
  fi
}

main "$@"

И вы можете использовать test ] имя функции. Если вы хотите вызвать встроенный тест , используйте конструкцию встроенного теста .

И позаботьтесь о = (назначение) и == (сравнение). Внутри теста [ и ] оператор = работает как == и проверяет равенство строк (не чисел).

set -o errexit завершает работу сразу после того, как команда вернет ненулевое значение (неудачно). Ваш ниндзя возвращает 1 (который не равен нулю) и завершает работу.

Ваш код без тестов не работает причина if оператор пытается выполнить инструкции в нем и определить состояние выхода команды: если состояние выхода равно нулю (успех), затем выполнить инструкции после , затем с до elif из fi .

15
12.05.2016, 11:48
4 ответа

- exclude-dir не понимает | .

Вы можете, однако, получить тот же эффект, указав - exclude-dir несколько раз, по одному для каждого каталога, который вы хотите исключить:

grep -inRw -E --exclude-dir 'asset' --exclude-dir 'git' --exclude-dir 'log' 'direct'
13
27.01.2020, 19:49

Описание этой опции на странице руководства вводит в заблуждение ... Это шаблон, как в globs , а не шаблон, как в regex . Согласно info странице :

- exclude-dir = GLOB

Пропускать любой каталог командной строки с суффиксом имени, который соответствует шаблону GLOB . При рекурсивном поиске пропустите все подкаталоги, чье базовое имя соответствует GLOB. Игнорируйте любые повторяющиеся косые черты в конце в GLOB.

Итак, в вашем случае вы можете запустить:

grep -inRw -E 'direct' . --exclude-dir={git,log,assets}

, чтобы исключить каталоги с именами git , log и assets или, например,

grep -inRw -E 'direct' . --exclude-dir={\*git,asset\*}

, чтобы исключить имена каталогов, заканчивающиеся на git или начинающиеся на asset .

45
27.01.2020, 19:49

Вот что я делал не так :вводом в --exclude-dirявляется каталог -имя (с ), а не имя пути (с ). имена каталогов не могут содержать /.

Следующие работы:

grep -r --exclude-dir={cache,lib} pattern /home/ /var/

Следование не работает:

grep -r --exclude-dir={/var/cache,/var/lib} pattern /home/ /var/
4
26.10.2020, 06:15

Пожалуйста, используйте это:

grep -inRw -E 'direct' folder/ --exclude-dir={\*git\*,\*log\*,\*assets\*}

или текущая папка

grep -inRw -E 'direct'. --exclude-dir -E 'git|log|asset'
0
14.01.2021, 17:42

Теги

Похожие вопросы