Як я можу показати всі типи файлів, що містяться в каталозі?


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 : видалити повторювані типи файлів

дякую, але я точно копіюю і минув "для файлу в dir / *; зробіть файл" $ file "| cut -d: -f 2 | сортуйте -u; зроблено" у своєму терміналі, і я отримав "ПОМИЛКУ"
Mohammad Reza Rezwani

2
@ Алекс, перш за все, будь ласка, завжди вказуйте точну помилку, яку ви отримали, сказавши, що "ПОМИЛКА" не дуже корисна. У будь-якому випадку помилка, ймовірно, тому, що у вас немає імені каталогу dir/, це було лише ім'я прикладу, вам потрібно буде змінити це на ім'я реального каталогу: for file in /home/alex/*; do ... doneнаприклад.
тердон

спасибі, якщо ви зробили мою неправильну роботу (... я думав, що команда dir така, як ls не каталог -sorry- і я думаю, що краще відредагувати свою відповідь). Ви просто бачите "ПОМИЛКУ" та більше нічого.
Мохаммед Реза Резвані

хороша робота, дякую, але я побачив, наприклад, чотири рядки "Аудіофайл з ID3 версії 2.3.0, містить" або більше "ISO Media, система MPEG v4, версія 2". Я не впевнений у "видаленні дубліката".
Мохаммед Реза Резвані

@alex досить чесно, відповідь відредагована. Ви не повинні отримувати жодних дублікатів. sort -uВидалять їх, лінії повинні бути різними (вони також можуть мати різну кількість прогалин, що робить їх неідентичних).
тердон

3

Я, мабуть, зробив щось подібне -

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

Він буде шукати файли (наприклад, відсутні каталоги) з поточного шляху, а потім виконувати fileкоманду для кожного файлу.


1

Спробуйте це:

ls | xargs file -b | sort | uniq

Як це працює:

ls : вміст каталогу списку

file -b : визначити тип файлу; не додавати назви файлів до вихідних рядків

сортувати : сортувати лінії

uniq : опустити повторні рядки



1
Ви можете використовувати file -b *замість ls | xargs file -b, щоб уникнути розбору ls.
wjandrea
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.