2015-04-08 6 views
2

Мне нужно найти двоичные файлы в каталоге. Я хочу сделать это с файлом, и после этого я проверю результаты с помощью grep. Но моя проблема в том, что я понятия не имею, что такое двоичный файл. Что даст команда файла для двоичных файлов или что я должен проверить с помощью grep?Как найти двоичные файлы в каталоге (linux)?

спасибо.

+0

Какие «бинарные» файлы вы здесь говорите? Есть ли у вас соответствующий «двоичный» файл в вашей системе? Что говорит «файл»? –

+0

Я не знаю, какие бинарные файлы, потому что моя домашняя работа не определяет его, только: напишите сценарий оболочки, используя команду grep (и другие), чтобы найти двоичные файлы в каталоге и написать их разрешения. Поэтому я не знаю ничего о бинарных файлах. –

+0

Это кажется мне неспецифичным. Я бы попросил разъяснений. Хотя, учитывая предложение использовать «grep», я собираюсь предположить, что это означает, что «содержит NUL-байт». –

ответ

-3

Вы можете использовать find и параметр -executable, который в основном то, что вы хотите.

страницы Справочника говорит:

-executable 
      Matches files which are executable and directories which are searchable (in a file name resolution sense). This takes into account access control lists and other permissions artefacts which the -perm test ignores. This test makes use of the access(2) system call, and so can be fooled by NFS servers which do UID mapping (or root-squashing), since many systems implement access(2) in the client's kernel and so cannot make use of the UID mapping information held on the server. Because this test is based only on the result of the access(2) system call, there is no guarantee that a file for which this test succeeds can actually be executed. 

Это результат того, что вы хотите:

# find /bin -executable -type f | grep 'dmesg' 
/bin/dmesg 
+1

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

+0

Итак, вы хотите, чтобы все файлы не были текстовыми, так? Вы можете сделать следующее: # для i in *; сделать файл $ i | grep -v ASCII | awk -F: '{print $ 1}'; done –

+0

Спасибо, я думаю, что он сработал;) –

2

Поскольку это задание, вы, вероятно, ненавидишь меня, если бы я дал вам полное решение; -) Итак, вот небольшой намек:

Команда grep выведет список двоичных файлов по умолчанию, если вы ищете регулярное выражение, такое как . th при будет соответствовать любой непустой файл:

grep . * 

Выход:

[...] 
Binary file c matches 
Binary file e matches 

Вы можете использовать awk получить только и ls имена файлов для печати разрешений. См. Соответствующие страницы руководства (man grep, man awk, man ls).

2

Просто упомянуть Perl «s -T тест для текстовых файлов, и его противоположность -B для бинарных файлов.

$ find . -type f | perl -lne 'print if -B' 

распечатает любые бинарные файлы, которые он видит. Используйте -T, если вы хотите получить обратное: текстовые файлы.

Это не полностью надежное, поскольку оно выглядит только в первых 1000 символах или около того, но это лучше, чем некоторые из предложенных здесь специальных методов. См. man perlfunc для всего краткого изложения. Вот краткое описание:

Переключатели «-T» и «-B» работают следующим образом. Первый блок или около файл проверяется, является ли он действительным UTF-8, который содержит не-ASCII-символы. Если, так что это файл -T. В противном случае эта часть рассматривается для нечетных символов, таких как странные управляющие коды или символы с высоким набором бит. Если более чем треть символов странно, это файл «-B»; в противном случае это файл "-T". Кроме того, любой файл, содержащий нулевой байт в рассмотренной части , считается двоичным файлом.

+0

странно, он не работает на моем ПК. Я попробовал 'find/usr/bin -type f | perl -ne 'print if -B'' и ничего не распечатывается –

+0

@ Lưu В качестве первого шага, что 'find/usr/bin -type f' говорит? – bobbogo

+0

это дает мне много файлов в/usr/bin, например '/ usr/bin/gitk'. Пробовал 'echo/usr/bin/gitk | perl -ne 'print if -B'', но все еще не работает –

2

Я поделюсь этой линией, которая не требует какого-либо другого инструмента, кроме find и grep:

find . -type f -exec grep -IL . "{}" \; > ../binary-files 

-I говорит Grep считать двоичные файлы как непревзойденные, -L печатает только несогласованные файлы, . соответствует любому остальное.