Команда Linux: Как «найти» только текстовые файлы? - PullRequest
88 голосов
/ 22 января 2011

После нескольких поисков в Google, я пришел к выводу:

find my_folder -type f -exec grep -l "needle text" {} \; -exec file {} \; | grep text

, что очень неудобно и выводит ненужные тексты, такие как информация о типе пантомимы.Есть лучшие решения?У меня есть много изображений и других двоичных файлов в одной папке с большим количеством текстовых файлов, которые мне нужно найти.

Ответы [ 15 ]

0 голосов
/ 07 декабря 2016

Вот упрощенная версия с расширенным объяснением для начинающих, таких как я, которые пытаются узнать, как поместить более одной команды в одну строку.

Если бы вы записали проблему поэтапно, она выглядела бынапример:

// For every file in this directory
// Check the filetype
// If it's an ASCII file, then print out the filename

Для этого мы можем использовать три команды UNIX: find, file и grep.

find проверит каждый файл в каталоге.

file даст нам тип файла.В нашем случае мы ищем возврат 'ASCII text'

grep будет искать ключевое слово 'ASCII' в выходных данных file

Так как мы можемобъединить их в одну строку?Есть несколько способов сделать это, но я считаю, что делать это в порядке нашего псевдокода имеет смысл (особенно для начинающего, такого как я).

find ./ -exec file {} ";" | grep 'ASCII'

Выглядит сложно, но неплохо, когда мы разбиваем его:

find ./ = просматривать каждый файл в этом каталоге.Команда find выводит имя файла любого файла, который соответствует «выражению», или любой другой, который идет после пути, который в нашем случае является текущим каталогом или ./

Самая важная вещь для пониманияявляется то, что все, что после этого первого бита будет оцениваться как True или False.Если True, имя файла будет распечатано.Если нет, то команда продолжается.

-exec = этот флаг - опция в команде find, которая позволяет нам использовать результат какой-либо другой команды в качестве выражения поиска.Это похоже на вызов функции внутри функции.

file {} = команда, вызываемая внутри find.Команда file возвращает строку, которая сообщает вам тип файла для файла.Обычно это будет выглядеть так: file mytextfile.txt.В нашем случае мы хотим, чтобы он использовал любой файл, который просматривается командой find, поэтому мы помещаем фигурные скобки {} в качестве пустой переменной или параметра.Другими словами, мы просто просим систему вывести строку для каждого файла в каталоге.

";" = это требуется для find и является знаком пунктуации в конце нашей команды -exec.Обратитесь к руководству для 'find' для получения дополнительных объяснений, если вам это нужно, запустив man find.

| grep 'ASCII' = | - труба.Труба принимает вывод того, что находится слева, и использует его как вход для всего, что находится справа.Он принимает вывод команды find (строка, которая является типом файла отдельного файла) и проверяет ее, чтобы увидеть, содержит ли она строку 'ASCII'.Если это так, возвращается true.

NOW, выражение справа от find ./ вернет true, когда команда grep вернет true.Вуаля.

0 голосов
/ 01 апреля 2016
  • пример bash для поиска текста "eth0" в / etc во всех текстовых / ascii-файлах

grep eth0 $ (find / etc / -type f -exec file {} \;| egrep -i "text | ascii" | cut -d ':' -f1)

0 голосов
/ 04 ноября 2014

Я предпочитаю xargs

find . -type f | xargs grep -I "needle text"

, если ваши имена файлов странные, посмотрите параметры -0:

find . -type f -print0 | xargs -0 grep -I "needle text"
0 голосов
/ 26 декабря 2012

Я делаю это так: 1) поскольку файлов слишком много (~ 30 тыс.) Для поиска, я ежедневно генерирую список текстовых файлов для использования через crontab, используя следующую команду:

find /to/src/folder -type f -exec file {} \; | grep text | cut -d: -f1 > ~/.src_list &

2) создать функцию в .bashrc:

findex() {
    cat ~/.src_list | xargs grep "$*" 2>/dev/null
}

Тогда я могу использовать следующую команду для поиска:

findex "needle text"

НТН:)

0 голосов
/ 22 января 2011

Как насчет этого

 find . -type f|xargs grep "needle text"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...