Как игнорировать / исключать файлы из вывода команды find с помощью grep?

#bash #grep #find

#bash #grep #Найти

Вопрос:

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

Моя незавершенная команда:

 find . -type f ( -name "*.txt" -or -name "*.html" -or -name "*.css" -or -name "*.js" -or -name "*.yml" ) | grep ..
  

Допустим, я хотел бы игнорировать 2 файла: cards.js и радио-и-флажки.css

Как я могу реализовать это с помощью команды grep? Я знаю, что есть способы без использования команды grep, но я хотел бы знать, как я могу это сделать с помощью grep.

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

Ответ №1:

Для достижения этой цели вы можете использовать флаг grep -v. Чтобы исключить один такой элемент из результатов:

 your commands here | grep -v "cards.js"
  

И если вы хотите связать несколько совпадений grep, сделайте это:

 yourcommands here | grep -v -e "cards.js" -e "radios-and-checkboxes.css"`
  

Пожалуйста, используйте -w , если вы хотите ТОЧНОГО совпадения со строками в grep. Итак, для точного соответствия с «cards.js » использование: grep -v -w -e "cards.js" . Использование -w once будет работать для нескольких расширений.

Комментарии:

1. поскольку . используется, это cardsajs также будет соответствовать

2. @oguzismail поскольку я использую команду find для поиска только .txt, .html, .css, .js и .yml, нет никакого риска для cardsajs сопоставления, не так ли?

3. @Marcin да. он будет соответствовать cardajs.js также

4. @Marcin это не будет соответствовать именам файлов, содержащим пробелы

5. и нет, вам нужно указать -w только один раз. Нравится grep -v -w -e file1 -e file2

Ответ №2:

Вы просите grep -v

  $ echo -e "anbnc" | grep -v b
  

Это печатает все, исключая b

Используйте «-e», чтобы исключить несколько совпадений,

  $ echo -e "anbnc" | grep -v -e a -e b
  

Это исключает как a и b

Ответ №3:

Используйте -E (расширенные) и -v (инвертировать совпадение) в grep :

 find ... | grep -v -E 'cards.js|radios-and-checkboxes.css'
  

| Символ является OR оператором.

Комментарии:

1. Хорошее объяснение флагов

2. поскольку . используется, это cardsajs также будет соответствовать

Ответ №4:

Чистое find решение без grep :

 find . -type f ( ( -name "*.txt" -o -name "*.html" -o -name "*.css" -o -name "*.js" -o -name "*.yml" ) -a ! -name "radios-and-checkboxes.css" -a ! -name "cards.js" )
  

Комментарии:

1. OP говорит, что я знаю, что есть способы без использования команды grep, но я хотел бы знать, как я могу это сделать с помощью grep.

2. Правильно, я это упустил.

Ответ №5:

В этом скрипте перечислены файлы, исключая список расширений. Это помогает при попытке обнаружить мусорные файлы. В примере используются обычные расширения. Это могло бы быть более компактным, но менее читаемым.

 #!/bin/bash
EXTENSIONS=$(cat <<'EOE'
.exe
.py
.js
.css
.html
EOE
)                                             # extensions, 1 per line
EXTENSIONS=$(echo "$EXTENSIONS"|tr "n" "|")  # convert to egrep pattern
EXTENSIONS=${EXTENSIONS%?}                    # remove trailing '|'
find . -type f | egrep -i -v "$EXTENSIONS"    # all files lacking EXTENSIONS