Как я могу показать все типы файлов, содержащиеся в каталоге?

12

Есть ли какая-либо команда, которая сообщает мне в определенном каталоге, какие типы файлов существуют?

Я могу узнать тип файла с помощью команды, как od -c myfile | less.

Но я не знаю, как это сделать для всех файлов в каталоге.

Мохаммед Реза Резвани
источник

Ответы:

19

Хотя на od -cсамом деле будет отображаться содержимое файла, это не хороший способ узнать его тип файла. Хотя некоторые файлы будут содержать заголовок с типом файла, не все будут. Лучшим способом является команда file:

$ echo "hello" > foo.txt
$ file foo.txt
foo.txt: ASCII text

Итак, чтобы получить список всех типов файлов в каталоге, вы можете сделать:

for file in dir/*; do file "$file" | cut -d: -f 2; done | sort -u

Пример вывода:

 PNG image data, 1500 x 500, 8-bit/color RGBA, non-interlaced
 ASCII text
 directory
 GIF image data, version 89a, 22 x 22
 ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=becf821e4d814fdb69306d0b3f686eb06992f5e5, stripped

объяснение

  • for file in dir/*; do ... done;: перебрать все в dir( dirэто просто пример, вы должны изменить его на имя фактического каталога, в котором вы хотите искать), сохраняя каждый элемент по очереди как$file
  • file "$file": запустить fileна каждом из найденных предметов.
  • cut -d: -f 2: печатать только второе поле (поля определены как :)
  • sed 's/^ //; s/ +/ /g' : удалить пробелы из начала строки и преобразовать последовательные пробелы в один пробел.
  • sort -u : удалить дубликаты типов файлов
terdon
источник
спасибо, но я точно
копирую и пропускаю
2
@alex Прежде всего, пожалуйста, всегда упоминайте, какую именно ошибку вы получаете, говоря, что вы получили "ОШИБКУ", что не очень полезно. В любом случае ошибка, вероятно, связана с тем, что у вас нет имени каталога dir/, это было просто имя примера, вам нужно изменить его на имя реального каталога: for file in /home/alex/*; do ... doneнапример.
Тердон
спасибо, если вы сделали мою неправильную работу (... я думал, что dir - это команда, как ls, а не каталог - извините, также я думаю, что лучше отредактировать ваш ответ) Вы просто видите "ОШИБКА" и ничего больше.
Мохаммад Реза Резвани
Хорошая работа, спасибо, но я видел, например, четыре строки «Аудио файл с ID3 версии 2.3.0, содержит» или более одного «ISO Media, MPEG v4 system, version 2». Я не уверен насчет "удалить дубликаты".
Мохаммад Реза Резвани
@alex достаточно честно, ответ отредактирован. Вы не должны получать дубликаты. Они sort -uбудут удалены, строки должны быть разными (они также могут иметь разное количество пробелов, что делает их не идентичными).
Тердон
3

Я бы, наверное, сделал что-то вроде этого -

find . -type f -exec file {}  \;

Он будет искать по текущему пути файлы (например, без каталогов) и затем выполнять fileкоманду для каждого файла.

Эллиот Фриш
источник
1

Попробуй это:

ls | xargs file -b | sort | uniq

Как это устроено:

ls : список содержимого каталога

файл -b : определить тип файла; не добавляйте имена файлов в выходные строки

сортировать : сортировать строки

uniq : пропустить повторные строки

Волчок
источник
1
Вы можете использовать file -b *вместо ls | xargs file -b, чтобы избежать разбора ls.
августа