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

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

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

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

12
задан 20.05.2020, 00:53

3 ответа

Хотя 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: распечатайте только второе поле (поля, определенные [1 112])
  • sed 's/^ //; s/ +/ /g': удалите пробелы с начала строки и преобразуйте последовательные пробелы в одиночный пробел.
  • sort -u: удалите типы дубликата файла
19
ответ дан 20.05.2020, 00:56
  • 1
    спасибо, Но я точно копирую и мимо " для файла в dir /*; действительно зарегистрируйте " $file" | сокращает-d:-f 2 | вид-u; done" в моем терминале и я получил " ERROR" – Uriel 20.05.2020, 00:56
  • 2
    @alex достаточно ярмарка, ответ отредактирован. Вы не должны получать дубликаты. Эти sort -u удалит их, строки должны отличаться (у них могло бы также быть различное количество пробелов, которое делает их неидентичными). – Jonas 20.05.2020, 00:57
  • 3
    спасибо, Если Вы сделали мою неправильную работу (... Я думал, что dir является командой как ls не каталог - извините также я передумываю для редактирования ответа), Вы просто видите " ERROR" и ничто иное. – Gigaxel 20.05.2020, 00:57
  • 4
    хорошее задание, thnaks, но я видел, например, четыре строки " Звуковой файл с версией 2.3.0 ID3, contains" или больше, чем one" ISO Media, система MPEG v4, версия 2 ". я не уверен в " удалите duplicate". – Jonas 20.05.2020, 00:57
  • 5
    @alex, в первую очередь, всегда упоминайте точную ошибку, которую Вы получаете, говоря, что Вы получили " ERROR" не очень полезно. В любом случае ошибка состоит, вероятно в том, потому что у Вас нет каталога, названного dir/, который был просто именем в качестве примера, необходимо будет изменить это на название реального каталога: for file in /home/alex/*; do ... done, например. – NathanOliver 20.05.2020, 00:58

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

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

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

3
ответ дан 20.05.2020, 00:54

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

ls | xargs file -b | sort | uniq

, Как это работает:

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

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

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

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

1
ответ дан 20.05.2020, 00:55

Теги

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