find + grep для соответствия точных ключевых слов в файле

Мой скрипт не подходит только для точных слов. Пример: 12312312Alachua21321 или Alachuas будут соответствовать Alachua .

 KEYWORDS=("Alachua" "Gainesville" "Hawthorne") IFS=$'\n' find . -size +1c -type f ! -exec grep -qF "${KEYWORDS[*]}" {} \; -exec truncate -s 0 {} \; 

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

Если вы хотите, чтобы grep соответствовал только целым словам, используйте флаг -w . От man grep :

  -w, --word-regexp Select only those lines containing matches that form whole words. The test is that the matching substring must either be at the beginning of the line, or preceded by a non-word constituent character. Similarly, it must be either at the end of the line or followed by a non-word constituent character. Word-constituent characters are letters, digits, and the underscore. 

Кроме того, grep не может принимать несколько шаблонов в качестве аргументов. Ваша команда будет расширена bash до

 grep -qF Alachua Gainesville Hawthorne 

Это означает « поиск Алахуа в файлах Гейнсвилл и Хоторн ». Чтобы передать несколько шаблонов grep вам нужно либо разделить их на | (вам нужно активировать расширенные регулярные выражения с -E ) или сохранить их в файл и передать этот файл grep с помощью -f :

  -f FILE, --file=FILE Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. (-f is specified by POSIX.) 

Например, в вашем скрипте вы можете создать временный файл, сохранить в нем шаблоны, а затем grep (нет причины устанавливать IFS здесь):

 #!/usr/bin/env bash KEYWORDS=("Alachua" "Gainesville" "Hawthorne") ## Create a temporary file tmp=$(mktemp); ## Save your keywords in that file for word in "${KEYWORDS[@]}"; do echo $word >> "$tmp"; done ## Now run your find command and tell grep ## to read the patterns from the temp file find . -size +1c -type f ! -exec grep -qwFf "$tmp" {} \; -exec truncate -s 0 {} \; 

В качестве альтернативы, создайте свой шаблон, присоединившись к интересующим вас цепочкам | и запустить grep с -E для расширенных регулярных выражений:

 #!/usr/bin/env bash patterns="Alachua|Gainesville|Hawthorne"; find . -size +1c -type f ! -exec grep -Eqw "$patterns" {} \; -exec truncate -s 0 {} \;