Если вы заинтересованы в поиске файлов любого типа по их магическим байтам с помощью удивительной утилиты file
в сочетании с мощностью find
, это может пригодиться:
$ # Let's make some test files
$ mkdir ASCII-finder
$ cd ASCII-finder
$ dd if=/dev/urandom of=binary.file bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.009023 s, 116 MB/s
$ file binary.file
binary.file: data
$ echo 123 > text.txt
$ # Let the magic begin
$ find -type f -print0 | \
xargs -0 -I @@ bash -c 'file "$@" | grep ASCII &>/dev/null && echo "file is ASCII: $@"' -- @@
Вывод:
file is ASCII: ./text.txt
Условные обозначения: $
- это интерактивная подсказка оболочки, в которую мы вводим наши команды
Вы можете изменить деталь после &&
, чтобы вызвать какой-либо другой сценарий или выполнитьтакже некоторые другие встроенные функции, например, если этот файл содержит заданную строку, присвойте ему весь файл или найдите в нем вторичную строку.
Объяснение:
find
элементы, которые являются файлами - Make
xargs
подача каждого элемента в виде строки в один слой bash
command / script file
проверяет тип файла по магическому байту,grep
проверяет, существует ли ASCII, если так, то после &&
выполняется ваша следующая команда. find
выводит результаты с разделением null
, это хорошо, если экранировать имена файлов с пробелами и метасимволами вit. xargs
, используя опцию -0
, читает их null
seВ аргументе -I @@
принимает каждую запись и использует как позиционный параметр / args для bash-скрипта. --
для bash
гарантирует, что все, что будет после аргумента, даже если оно начинается с -
, как -c
, который в противном случае может быть интерпретирован как опция bash
Если вам нужно найти типы, отличные от ASCII, просто замените grep ASCII
другим типом, например grep "PDF document, version 1.4"