Jak mogę wyświetlić wszystkie typy plików zawarte w katalogu?

12

Czy jest jakieś polecenie, które mówi mi w określonym katalogu, jakie typy plików istnieją?

Mogę znaleźć typ pliku za pomocą polecenia podobnego do od -c myfile | less.

Ale nie wiem, jak to zrobić dla wszystkich plików w katalogu.

Mohammad Reza Rezwani
źródło

Odpowiedzi:

19

Chociaż od -crzeczywiście pokaże zawartość pliku, nie jest to dobry sposób na uzyskanie typu pliku. Chociaż niektóre pliki będą zawierać nagłówek z typem pliku, nie wszystkie będą. Lepszym sposobem jest polecenie file:

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

Aby uzyskać listę wszystkich typów plików w katalogu, możesz:

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

Przykładowe dane wyjściowe:

 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

Wyjaśnienie

  • for file in dir/*; do ... done;: iteruj przez wszystko w dir( dirto tylko przykład, powinieneś zmienić to na nazwę katalogu, który chcesz przeszukać), zapisując kolejno każdy element jako$file
  • file "$file": uruchom filena każdym ze znalezionych elementów.
  • cut -d: -f 2: wydrukuj tylko drugie pole (pola zdefiniowane przez :)
  • sed 's/^ //; s/ +/ /g' : usuń spacje z początku wiersza i przekonwertuj kolejne spacje na jedną spację.
  • sort -u : usuń zduplikowane typy plików
terdon
źródło
dzięki, ale dokładnie
kopiuję i wklejam
2
@alex przede wszystkim zawsze proszę podawać dokładny błąd, który otrzymujesz, mówiąc, że masz komunikat „BŁĄD”, co nie jest bardzo przydatne. W każdym razie błąd prawdopodobnie wynika z tego, że nie masz nazwanego katalogu dir/, to była tylko przykładowa nazwa, musisz zmienić go na nazwę prawdziwego katalogu: for file in /home/alex/*; do ... donena przykład.
terdon
dzięki, jeśli zrobiłeś moją niewłaściwą pracę (... Myślałem, że dir jest poleceniem jak ls nie katalog-adsory- również myślę, że lepiej jest edytować twoją odpowiedź) Po prostu widzisz „BŁĄD” i nic więcej.
Mohammad Reza Rezwani
niezła robota, dziękuję, ale widziałem na przykład czteroliniowy „Plik audio z ID3 w wersji 2.3.0, zawiera” lub więcej niż „ISO Media, system MPEG v4, wersja 2”. Nie jestem pewien, czy „usuń duplikat”.
Mohammad Reza Rezwani
@alex wystarczy, odpowiedź zredagowana. Nie powinieneś otrzymywać żadnych duplikatów. sort -uBędzie je usunąć, linie muszą być różne (mogą one również mieć różną liczbę miejsc, które sprawia, że nie identyczne).
terdon
3

Prawdopodobnie zrobiłbym coś takiego -

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

Spowoduje to wyszukiwanie z bieżącej ścieżki w poszukiwaniu plików (np. Bez katalogów), a następnie wykonanie filepolecenia dla każdego pliku.

Elliott Frisch
źródło
1

Spróbuj tego:

ls | xargs file -b | sort | uniq

Jak to działa:

ls : wyświetla zawartość katalogu

plik -b : określ typ pliku; nie dołączaj nazw plików do linii wyjściowych

sortuj : sortuj linie

uniq : pomiń powtarzające się linie

Wolfy
źródło
1
Możesz użyć file -b *zamiast ls | xargs file -b, aby uniknąć parsowania ls.
wjandrea