Bagaimana cara menampilkan tipe file dengan ls?

12

Saya tidak tahu apakah lsmampu menampilkan kolom tipe file.

Melakukan pencarian online cepat dan pencarian mantidak mengungkapkan kemampuan seperti itu. Apakah ia mampu melakukan ini?

Klarifikasi: Ini sangat membantu jika file tidak memiliki ekstensi.

Memperbarui

Pada 2018-04-28 jawabannya sudah cukup menarik namun mereka tidak memberikan apa yang saya cari. Lebih spesifik,

  • filememang memberikan tipe file yang sebenarnya tetapi tidak terintegrasi dengan baik ls. Secara khusus, saya gunakanls -lhtrpG --group-directories-first --color=always

  • ls -Fadalah lssolusi namun menyediakan simbol bukan kolom dari tipe file yang sebenarnya.

Untuk alasan ini saya belum menandai jawaban mana pun sebagai jawaban yang saya cari.

pengguna10853
sumber
info terkait: untuk dibaca manusia: ls -lahtrpF --group-directories-first --color=always /devatau ls -lsahG /dev, dan untuk dibaca program ls -lsa /dev. lihat man lsdokumentasi untuk detailnya.
user1742529

Jawaban:

16

filejelas merupakan pilihan yang tepat untuk mendapatkan informasi jenis file yang Anda inginkan. Untuk menggabungkan hasilnya dengan yang lssaya sarankan untuk digunakan find:

find -maxdepth 1 -type f -ls -exec file -b {} \;

Ini menemukan setiap file di direktori saat ini dan mencetak output ls -dilsserta output file -buntuk itu, masing-masing pada baris sendiri. Contoh output:

  2757145      4 -rw-rw-r--   1 dessert dessert      914 Apr 26 14:02 ./some.html
HTML document, ASCII text
  2757135      4 -rw-rw-r--   1 dessert dessert      201 Apr 13 15:26 ./a_text_file
UTF-8 Unicode text, with CRLF, LF line terminators

Namun, karena Anda tidak menginginkan baris filetype melainkan kolom filetype , berikut ini cara untuk menghilangkan karakter baris baru di antara baris-baris tersebut:

find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '\n' '\t'; file -b {}" \;

Output sampel:

-rw-rw-r-- 1 dessert dessert 914 Apr 26 14:02 ./some.html    HTML document, ASCII text
-rw-rw-r-- 1 dessert dessert 201 Apr 13 15:26 ./a_text_file  UTF-8 Unicode text, with CRLF, LF line terminators

Kolom baru itu cukup panjang, jadi mari kita potong semuanya dari koma pertama:

find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '\n' '\t'; file -b {} | cut -d, -f1" \;

Output yang terlihat seperti ini:

-rw-rw-r-- 1 dessert dessert 914 Apr 26 14:02 ./some.html    HTML document
-rw-rw-r-- 1 dessert dessert 201 Apr 13 15:26 ./a_text_file  UTF-8 Unicode text

Ini tidak cukup berguna, jadi bagaimana dengan alias? Dengan baris berikut dalam ~/.bash_aliasesfile Anda, Anda hanya perlu menjalankan lsfuntuk mendapatkan output di atas untuk direktori saat ini.

alias lsf='find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '"'\n'"' '"'\t'"'; file -b {} | cut -d, -f1" \;'
pencuci mulut
sumber
1
Jika Anda menggunakan fungsi alih-alih alias, itu tidak akan menjadi kutip, dan jika Anda menggunakan pasteatau column, Anda bisa mendapatkan perataan yang lebih baik: lsf () { find -maxdepth 1 -type f -exec bash -c 'column <(ls -l "$@") <(file -b "$@" | cut -d, -f1)' _ {} + ; }Masalah perataan tidak jelas dalam jawaban karena ukuran dan tanggal yang sama. (Ini juga akan sedikit lebih cepat, karena perintah akan dipanggil lebih sedikit kali daripada sekali per file.)
muru
@muru Terima kasih atas banyak saran bagus! Apakah columnpendekatan ini bekerja untuk Anda? Itu hanya mencetak output ls -luntuk setiap file diikuti oleh fileoutput untuk setiap file untuk saya, seolah-olah shell hanya akan melakukan ls -l "$@"; file -b "$@" | cut -d, -f1...
makanan penutup
Itu benar. paste.ubuntu.com/p/KjPthXPDPb - bagian atas dari alias dan bagian bawah adalah fungsinya, keduanya dijalankan dari /etc.
muru
Saya rasa saya melihat masalahnya - jika columnoutput tidak ke terminal, Anda perlu menentukan jumlah kolom atau akan menampilkan file satu demi satu; jadi column -c "$COLUMNS" ...harus bekerja dalam kedua kasus.
muru
Anda meluncurkan (setidaknya?) 5 proses untuk setiap file, jadi ini mungkin akan lambat ketika ada banyak file dalam direktori ...
JanC
10

Saya pikir cara terbaik untuk menampilkan jenis file menggunakan perintah ini:

file <filename>

Jika Anda ingin membuat daftar jenis semua file dalam direktori, cukup gunakan:

file *

<code> file * </code> sampel dari komputer saya

Untuk detail lebih lanjut tentang argumen, lihat:

man file
singrium
sumber
Sementara jawaban ini tidak langsung menjawab pertanyaan OP, itu menunjukkan cara yang benar untuk menemukan jenis pantomim file dan harus ditandai sebagai jawaban yang benar. Untuk mendapatkan mime typesaja, penggunaan: file --mime-type filename.
Pedro Lobito
@PedroLobito Saya pikir pertanyaan yang berkaitan erat mencakup filecukup baik, tetapi pertanyaan ini berbeda.
hidangan penutup
Saya memilih jawaban ini karena Anda adalah yang pertama memberikan filejawaban. Ketika saya menjawab yang lain ini tidak cukup (perlu diintegrasikan dengan ls) jadi saya tetap memberikan suara. Terima kasih.
user10853
1
file * adalah jawaban terbaik
tramada
1
file --mime /dev/*untuk daftar mimes dalam direktori / dev, bukan saat ini
user1742529
7

Untuk kejelasan, saya akan menunjukkan bahwa Anda dapat melihat jenis file dalam arti dasar dengan ls, menggunakan -Fflag (mengklasifikasikan) yang menambahkan simbol ke nama file tergantung pada jenisnya:

‘-F’
‘--classify’
‘--indicator-style=classify’
     Append a character to each file name indicating the file type.
     Also, for regular files that are executable, append ‘*’.  The file
     type indicators are ‘/’ for directories, ‘@’ for symbolic links,
     ‘|’ for FIFOs, ‘=’ for sockets, ‘>’ for doors, and nothing for
     regular files.

Anda dapat melihat bahwa informasi sedikit kurang cryptically ditampilkan dalam huruf pertama dari keluaran ls -l, meskipun. Jawaban wjandrea menjelaskan hal ini lebih terinci.

Tapi saya tidak berpikir ini yang Anda maksud dengan tipe file. The lsperintah tidak terlihat file dalam biasa - hanya pada daftar direktori (yang menyimpan nama file) dan inodes (yang menyimpan metadata, termasuk "tipe" dalam arti yang disebutkan sebelumnya).

Jadi, lsperintah tidak dapat menampilkan jenis file dalam arti apakah itu gambar JPG atau file biner atau file teks atau dokumen LibreOffice dari beberapa jenis, karena tidak memiliki informasi itu.

Untuk itu, seperti yang ditunjukkan oleh singrium , Anda memerlukan fileperintah, yang melihat 50-100 kB pertama atau lebih dari konten file untuk menentukan jenisnya.

Zanna
sumber
@Zana Terima kasih telah meningkatkan perhatian saya pada bendera ini. Ini akan melakukannya untuk saat ini meskipun itu bukan yang saya cari (tipe file yang sebenarnya). Untuk ini saya akan memilihnya.
user10853
3

Salah satu bentuk tipe file adalah apakah file adalah file biasa, direktori, perangkat, symlink, dll. lsDapat menunjukkan ini menggunakan opsi -latau -F.

  • Opsi -lakan menampilkan filetype sebagai karakter tunggal pada awal daftar, misalnya:

    $ ls -l
    drwxrwxr-x 2 user user 4096 Dec 11 00:18 DIR
    -rw-rw-r-- 1 user user    0 Dec 11 00:18 FILE
    lrwxrwxrwx 1 user user    4 Dec 11 00:19 LINK -> FILE
    

    Di mana -file biasa, dadalah direktori, dan lmerupakan symlink.

  • Opsi -Fakan menampilkan filetype sebagai akhiran, misalnya:

    $ ls -F
    DIR/ FILE LINK@
    

    Di mana tidak ada akhiran adalah file biasa, /adalah direktori, dan @merupakan symlink.

Info lebih lanjut tentang ini tersedia di info coreutils 'ls invocation', disimpulkan di sini:

Untuk -l:

‘-’ regular file
‘b’ block special file
‘c’ character special file
‘C’ high performance (“contiguous data”) file
‘d’ directory
‘D’ door (Solaris 2.5 and up)
‘l’ symbolic link
‘M’ off-line (“migrated”) file (Cray DMF)
‘n’ network special file (HP-UX)
‘p’ FIFO (named pipe)
‘P’ port (Solaris 10 and up)
‘s’ socket
‘?’ some other file type

Untuk -F:

nothing for regular files
‘*’ regular files that are executable
‘/’ directories
‘@’ symbolic links
‘|’ FIFOs
‘=’ sockets
‘>’ doors
wjandrea
sumber