#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