Ищите только в файлах простого текста, которые не являются исходным кодом

[12170] find[1177942] ищет везде, в том числе и в специальных файловых системах. По крайней мере, используйте[12171]для поиска только дисковых файлов. Если у вас несколько разделов, перечислите их все; например, если у вас есть отдельная файловая система [1177943]/home[1177944]:[12172]То есть [1177945]find[1177946] - это скорее инструмент последней инстанции, возможно, есть и лучший способ. Большинство дистрибутивов настраивают базу данных [1177947]найти[1177948]: базу данных имен файлов, обновляемую ночью программой [1177949]updateb[1177950]. Запустите [1177951] и найдите rvm.sh, чтобы найти файлы, имя которых содержит[1177952]rvm.sh`.[12173] То есть... [1177953]rvm.sh[1177954] находится везде, куда вы его поместили. Так как он не упакован для SuSE (насколько я могу судить), вы должны были установить его вручную.[1177365].
1
16.03.2015, 01:55
2 ответа

С помощью GNU grep передайте - двоичные файлы=без совпадения, чтобы игнорировать двоичные файлы. Файлы с исходным кодом являются текстовыми файлами, поэтому они будут включены в результаты.

Если вы хотите игнорировать текстовые файлы с определенными расширениями, вы можете использовать опцию --exclude, например,

grep -r --exclude='*.html' --exclude='*.js' …

или вместо этого включить только явно совпадающие файлы, например,

grep -r --include='*.txt' …

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

find -type f exec sh -c '
  for x do
    case $(file <"$x") in
      *source*) :;; # looks like source code
      *text*) grep -H -e "$0" "$x";; # looks like text
      # else: looks like binary
    esac
  done
' "REGEXP" {} +

или

find -type f exec sh -c '
  for x do
    case $(file -i <"$x") in
      text/plain\;*) grep -H -e "$0" "$x";; # looks like text
      # else: looks like source code or binary
    esac
  done
' "REGEXP" {} +

ackack вместо grep. Ack интегрирует систему классификации файлов, основанную на именах файлов. По умолчанию она ориентирована на поиск в исходном коде, но вы можете указать ей искать разные типы, передав опцию --type. --type может помочь поиск ВСЕХ файлов с помощью ack.

3
27.01.2020, 23:20

Если вы хотите ограничить только по расширению файла, вы можете использовать опцию grep --include:

grep -R --include="*.txt" "pattern" /path/to/dir/

Другой подход - это исключить файлы, которые не являются текстом, но он будет включать в себя файлы HTML и JS, который после обновления исключен с вариантом --exclude, например:

find /path/to/dir -type f -print | xargs file | grep text | cut -f1 -d: | xargs grep --exclude=\*.{js,html} "pattern"

Где, как уже упоминалось в комментарии, также вы можете использовать опцию --exclude-from = файл.

1
27.01.2020, 23:20

Теги

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