Я знаю, что это старый поток, но я наткнулся на него и подумал, что поделюсь своим методом, который, как я обнаружил, является очень быстрым способом find
поиска только небинарных файлов:
find . -type f -exec grep -Iq . {} \; -print
Параметр -I
grep указывает ему немедленно игнорировать двоичные файлы, а .
параметр вместе с параметром -q
заставит его немедленно сопоставить текстовые файлы, поэтому он выполняется очень быстро. Если вас беспокоят пробелы, вы можете заменить его -print
на a -print0
для подключения к трубопроводу xargs -0
или чего-то еще (спасибо за подсказку, @ lucas.werkmeister!)
Кроме того, первая точка необходима только для определенных версий BSD, find
например, в OS X, но это не повредит, если вы хотите поместить ее в псевдоним или что-то в этом роде.
РЕДАКТИРОВАТЬ : Как правильно указал @ruslan, -and
можно опустить, поскольку это подразумевается.
find . -type f -exec grep -Il "" {} \;
.find -type f -exec grep -Iq . {} \; -and -print
which имеет то преимущество, что он хранит файлыfind
; вы можете заменить его-print
другим,-exec
который запускается только для текстовых файлов. (Если вы разрешитеgrep
печатать имена файлов, вы не сможете различать имена файлов с символами новой строки в них.)find . -type f -exec grep -Il . {} +
намного быстрее. Недостатком является то, что он не может быть продлен другим,-exec
как предложил @ lucas.werkmeisterОсновываясь на этом вопросе SO :
grep -rIl "needle text" my_folder
источник
-I
это спасатель.Почему неудобно? Если вам нужно часто использовать его и вы не хотите вводить его каждый раз, просто определите для него функцию bash:
поместите его в свой,
.bashrc
а затем просто запустите:когда угодно.
ИЗМЕНИТЬ, чтобы отразить редактирование OP:
если вы хотите вырезать MIME-информацию, вы можете просто добавить в конвейер еще один этап, который фильтрует MIME-информацию. Это должно помочь, если взять только то, что было раньше
:
:cut -d':' -f1
:источник
file
руководства: «Пользователи должны знать, что все читаемые файлы в каталоге имеют напечатанное слово« текст »»./proc/meminfo
и/proc/cpuinfo
т.д. являются текстовыми файлами, ноfile /proc/meminfo
говорит/proc/meminfo: empty
. Мне интересно, нужно ли тестировать «пустой» в дополнение к «тексту», но не уверен, могут ли другие типы сообщать «пустой».К сожалению, это не экономия места. Поместив это в сценарий bash, это немного упростит.
Это безопасно в космосе:
источник
text.bin
? 2. Что делать, если имя файла содержит:
?Другой способ сделать это:
Если вам тоже нужны пустые файлы:
источник
Как насчет этого:
Если вам нужны имена файлов без типов файлов, просто добавьте последний
sed
фильтр.Вы можете отфильтровать ненужные типы файлов, добавив дополнительные
-e 'type'
параметры к последнемуgrep
команде.РЕДАКТИРОВАТЬ:
Если ваша
xargs
версия поддерживает эту-d
опцию, приведенные выше команды станут проще:источник
Вот как я это сделал ...
1. сделайте небольшой скрипт, чтобы проверить, является ли файл простым текстовым istext:
2. используйте find как раньше
источник
== *"text"* ]]
?У меня две проблемы с ответом на его размер:
Это только список текстовых файлов. На самом деле он не выполняет их поиск по запросу. Для фактического поиска используйте
Он запускает процесс grep для каждого файла, что очень медленно. Лучшее решение тогда
или просто
Это займет всего 0,2 с по сравнению с 4 с для решения выше (2,5 ГБ данных / 7700 файлов), то есть в 20 раз быстрее .
Кроме того, никто не упомянул ag, Silver Searcher или ack-grep в качестве альтернатив. Если один из них доступен, это гораздо лучшая альтернатива:
И последнее примечание: остерегайтесь ложных срабатываний (двоичные файлы принимаются как текстовые). У меня уже было ложное срабатывание при использовании grep / ag / ack, поэтому лучше сначала перечислить совпадающие файлы, прежде чем редактировать файлы.
источник
Хотя это старый вопрос, я думаю, что приведенная ниже информация повысит качество ответов здесь.
При игнорировании файлов с установленным исполняемым битом я просто использую эту команду:
Чтобы он не рекурсивно заходил в другие каталоги:
Нет необходимости использовать каналы для смешивания большого количества команд, только мощная простая команда find .
Тем не менее, я надеюсь, что это будет полезно для всех.
источник
Я делаю это следующим образом: 1) поскольку файлов слишком много (~ 30k) для поиска, я ежедневно генерирую список текстовых файлов для использования через crontab, используя следующую команду:
2) создайте функцию в .bashrc:
Затем я могу использовать команду ниже для поиска:
HTH :)
источник
Я предпочитаю xargs
если у вас странные имена файлов, посмотрите с помощью опций -0:
источник
grep eth0 $ (найти / etc / -type f -exec file {} \; | egrep -i "text | ascii" | cut -d ':' -f1)
источник
Вот упрощенная версия с расширенным объяснением для новичков, вроде меня, которые пытаются научиться помещать более одной команды в одну строку.
Если бы вы описали проблему поэтапно, это выглядело бы так:
Для достижения этой цели мы можем использовать три команды UNIX:
find
,file
иgrep
.find
проверит каждый файл в каталоге.file
предоставит нам тип файла. В нашем случае мы ищем возврат «текста ASCII».grep
будет искать ключевое слово 'ASCII' в выводе изfile
Итак, как мы можем связать их в одну строку? Есть несколько способов сделать это, но я считаю, что выполнение этого в порядке нашего псевдокода имеет наибольший смысл (особенно для новичка вроде меня).
find ./ -exec file {} ";" | grep 'ASCII'
Выглядит сложно, но неплохо, если разобрать:
find ./
= просмотреть все файлы в этом каталоге. Вfind
выводит имя файла любого файла, который соответствует 'выражению' или тому, что идет после пути, который в нашем случае является текущим каталогом или./
Самое важное, что нужно понять, это то, что все, что находится после этого первого бита, будет оцениваться как True или False. Если True, имя файла будет распечатано. Если нет, то команда переходит к следующему.
-exec
= этот флаг - опция в команде find, которая позволяет нам использовать результат какой-либо другой команды в качестве выражения поиска. Это похоже на вызов функции внутри функции.file {}
= команда, вызываемая внутриfind
. Командаfile
возвращает строку, которая сообщает вам тип файла. Регулярно, это будет выглядеть следующим образом :file mytextfile.txt
. В нашем случае мы хотим, чтобы он использовал любой файл, просматриваемыйfind
командой, поэтому мы вставляем фигурные скобки,{}
чтобы они действовали как пустая переменная или параметр. Другими словами, мы просто просим систему выводить строку для каждого файла в каталоге.";"
= это требуется дляfind
знака препинания в конце нашей-exec
команды. См. Руководство по поиску для получения дополнительных объяснений, если вам это нужно, запустивman find
.| grep 'ASCII'
=|
это труба. Pipe принимает вывод того, что находится слева, и использует его как ввод для всего, что находится справа. Он берет выходные данныеfind
команды (строку, которая является типом файла одного файла) и проверяет его, чтобы увидеть, содержит ли он строку'ASCII'
. Если да, возвращается истина.СЕЙЧАС выражение справа
find ./
вернет истину, когдаgrep
команда вернет истину. Вуаля.источник
Если вы хотите найти файлы любого типа по их магическим байтам, используя потрясающую
file
утилиту в сочетании с мощьюfind
, это может вам пригодиться:Вывод:
Легенда:
$
это интерактивное приглашение оболочки, в котором мы вводим наши командыВы можете изменить часть после,
&&
чтобы вызвать какой-либо другой скрипт или сделать что-то еще встроенным, то есть, если этот файл содержит заданную строку, отбирать весь файл или искать в нем вторичную строку.Пояснение:
find
элементы, которые являются файламиxargs
подачу каждого элемента в виде строки в однуbash
команду / скрипт лайнераfile
проверяет тип файла по магическому байту,grep
проверяет, существует ли ASCII, если да, то после выполнения&&
вашей следующей команды.find
выводит результатыnull
разделенными, это хорошо, чтобы экранировать имена файлов с пробелами и метасимволами в нем.xargs
, используя-0
опцию, читает их поnull
отдельности,-I @@
берет каждую запись и использует в качестве позиционного параметра / аргументов для сценария bash.--
forbash
гарантирует, что все, что идет после него, является аргументом, даже если оно начинается с-
like,-c
которое в противном случае могло бы быть интерпретировано как параметр bashЕсли вам нужно найти типы, отличные от ASCII, просто замените
grep ASCII
на другой тип, напримерgrep "PDF document, version 1.4"
источник
Используйте команду find, чтобы вывести список всех файлов, используйте команду file, чтобы убедиться, что они текстовые (не tar, key), наконец, используйте команду awk для фильтрации и печати результата.
источник
Как насчет этого
источник
"needle text"
"needl text"
"needle text"
он будет найден