Как узнать настоящий Тип файла файлов внутри файла zip или tar.gz?

Встроенные функции оболочки доступны только оболочке, поэтому внешние команды не могут их запускать. например команда external time может запускать только другие внешние команды. Внешние команды не могут запускать встроенные оболочки, псевдонимы оболочки или функции оболочки.

Обратите внимание, что оболочки сами по себе являются внешними командами (например, / bin / sh , / bin / bash и т. Д.), Поэтому внешние команды могут запускать оболочку с помощью -c , например сравните sh -c 'time echo foo' с sh -c '/ usr / bin / time echo foo' или выполните сценарий оболочки, который использует встроенные функции.

Если есть внешние команды с тем же именем, что и встроенная оболочка (например, time , echo , kill , ...) тогда внешние команды могут запускать их, но даже если они выполняют одну и ту же базовую задачу, они, вероятно, будут немного отличаться (например, разные параметры командной строки, другой формат вывода, разные возможности - встроенный kill может убить с помощью номер задания оболочки, внешний kill не может).

Встроенные команды оболочки (например, time или команда ) могут выполнять как встроенные, так и внешние команды, а также псевдонимы оболочки и функции.

0
28.05.2019, 09:23
2 ответа

Команда fileдолжна рассказать вам о самом файле:

$ file test.zip
test.zip: Zip archive data, at least v1.0 to extract
$ file test.tar.gz
test.tar.gz: gzip compressed data, last modified: Sun May 26 11:28:34 2019, from Uniz

Но для файлов внутри архивов вам нужно извлечь их и запустить fileдля каждого из них по отдельности.

0
28.01.2020, 02:22

С GNUtar:

tar --to-command='exec file -b -' -xvvf file.tar.gz

Для файлов zipвы можете конвертировать в tarна лету с помощью bsdtarи снова использовать GNU tarдля вызова fileдля каждого члена:

bsdtar cf - @file.zip | tar --to-command='exec file -b -' -xvvf -

Выдает такой результат, как:

-rw-rw-r-- 0/0            7653 1999-12-30 10:26 WINOBJ.HLP
MS Windows 3.1 help, Thu Dec 30 15:26:17 1999, 7653 bytes
-rw-rw-r-- 0/0            7005 2006-07-28 08:32 Eula.txt
Non-ISO extended-ASCII text, with very long lines, with CRLF line terminators
-rw-rw-r-- 0/0          729464 2011-02-14 11:37 Winobj.exe
PE32 executable (GUI) Intel 80386, for MS Windows

Команда fileугадывает тип файла, используя эвристику на основе первых нескольких байтов файла. Так что в любом случае данные нужно извлекать из файла. Даже для того, чтобы сообщить о выводе tar tvf, tarнеобходимо прочитать и распаковать весь архив, поскольку информация хранится перед содержимым каждого элемента архива, но ни одно из приведенных выше решений не извлекает элементы на диск ., данные передаются из bsdtarв tarи из tarв fileпо каналам, содержимое элементов архива даже не сохраняется целиком в памяти.

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

Неоптимальным с точки зрения эффективности является выполнение одной командыsh(для интерпретации командной строки exec file -b -)и одной команды fileдля каждого члена обычного файлового архива. Мы используем exec, чтобы один и тот же процесс повторно использовался для shиfile(для тех shреализаций, таких как dash, которые не выполняют эту оптимизацию сами по себе ).

3
28.01.2020, 02:22

Теги

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