Dosya türünü ls ile nasıl görüntülerim?


12

Ben lsbir filetype sütun görüntüleme yeteneğine sahip olup olmadığını bilmiyorum .

Hızlı bir çevrimiçi arama yapmak ve aramak manböyle bir yeteneği ortaya çıkarmadı. Bunu yapabilir mi?

Açıklama: Bu, özellikle dosyaların bir uzantısı yoksa yararlıdır.

Güncelleme

2018-04-28 itibariyle cevaplar oldukça ilginçti, ancak aradığım şeyi sağlamadılar. Daha spesifik olarak,

  • filegerçek dosya türlerini verir, ancak iyi entegre olmaz ls. Özellikle,ls -lhtrpG --group-directories-first --color=always

  • ls -Fbir lsçözümdür, ancak gerçek dosya türlerinin sütununu değil, semboller sağlar.

Bu nedenle cevaplardan hiçbirini aradığım cevap olarak işaretlemedim.



ilgili bilgi: okunabilir insan için: ls -lahtrpF --group-directories-first --color=always /devveya ls -lsahG /devprogram tarafından okunabilir ls -lsa /dev. bkz man lsayrıntılar için belgelere.
user1742529

Yanıtlar:


17

fileistediğiniz dosya türü bilgilerini almak için kesinlikle doğru seçimdir. Çıktısını aşağıdakilerle birleştirmek lsiçin findşunları kullanmanızı öneririz :

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

Bu, geçerli dizindeki her dosyayı bulur ve bunun çıktısını ls -dilsve çıktısını file -bher biri kendi satırına yazdırır . Örnek çıktı:

  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

Ancak, bir filetype satırı değil, bir filetype sütunu istemediğiniz için, satırlar arasındaki yeni satır karakterinden kurtulmanın bir yolu:

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

Örnek çıktı:

-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

Bu yeni sütun oldukça uzun, bu yüzden ilk virgülden her şeyi keselim:

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

Bunun çıktısı şuna benzer:

-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

Bu çok kullanışlı değil, peki ya bir alias? ~/.bash_aliasesDosyanızda aşağıdaki satırla lsf, geçerli dizinin yukarıdaki çıktısını almak için çalıştırmanız yeterlidir .

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

1
Bir takma ad yerine bir işlev kullanırsanız, bu bir alıntı cehenneminden daha az olacaktır ve pasteveya kullanırsanız columndaha iyi hizalama elde edebilirsiniz: lsf () { find -maxdepth 1 -type f -exec bash -c 'column <(ls -l "$@") <(file -b "$@" | cut -d, -f1)' _ {} + ; }Benzer boyutlar ve tarihler nedeniyle yanıtta hizalama sorunu belirgin değildir. (Bu da biraz daha hızlı olacaktır, çünkü komutlar dosya başına bir kez yerine daha az kez çalıştırılacaktır.)
muru

@muru Çok iyi öneriler için teşekkürler! Bu columnyaklaşım sizin için işe yarıyor mu? Sadece ls -lher dosya için çıktısını yazdırır, ardından filebenim için her dosya için çıktıyı yazdırır, kabuk sanki ls -l "$@"; file -b "$@" | cut -d, -f1...
tatlı

Öyle. paste.ubuntu.com/p/KjPthXPDPb - üst kısım takma addan , alt kısım ise her ikisinden de gelen işlevdir /etc.
muru

Bence sorunu görüyorum - columnçıktı terminal için değilse, sütun sayısını belirtmeniz gerekir ya da birbiri ardına dosyaları çıktı; böylece column -c "$COLUMNS" ...her iki durumda da çalışması gerekir.
muru

(En azından?) Her dosya için 5 işlem başlatıyorsunuz, bu yüzden bir dizinde çok sayıda dosya olduğunda bu muhtemelen yavaş olacak ...
JanC

11

Bir dosya türünü görüntülemek için en iyi yolu bu komutu kullanmak olduğunu düşünüyorum:

file <filename>

Bir dizindeki tüm dosya türlerini listelemek istiyorsanız, şunu kullanın:

file *

<code> dosya * </code> bilgisayarımdan örnek

Argümanlar hakkında daha fazla bilgi için, bkz:

man file

1
Bu yanıt OP'nin sorusuna doğrudan yanıt vermese de, bir dosyanın mime türünü bulmanın doğru yolunu gösterir ve doğru yanıt olarak işaretlenmelidir. Almak için mime typesadece, kullanımı: file --mime-type filename.
CONvid19

@PedroLobito Bence yakından ilişkili soru kapakları fileoldukça iyi, ancak bu soru farklıdır.
tatlı

İlk cevap veren siz olduğunuz için bu cevabı fileoyluyorum. Diğerlerine cevap verdiğim gibi bu yeterli değil (ls ile entegre edilmesi gerekiyor), bu yüzden bir oylamaya devam ediyorum. Teşekkür ederim.
user10853

1
dosya * en iyi cevaptır
tramada

1
file --mime /dev/*akım yerine dizin / dev içindeki liste
dakikaları için

7

Açıklık için, dosya türüne türüne bağlı olarak bir sembol ekleyen bayrağını (sınıflandırmak) kullanarak dosya türünü temel anlamda görebileceğinizi göstereceğim:ls-F

‘-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.

ls -lYine de , bilginin çıktısının ilk harfinde biraz daha az şifreli olarak görüntülendiğini görebilirsiniz . wjandrea'nın cevabı bunu daha ayrıntılı olarak açıklıyor.

Ama dosya türüne göre bunu demek istemiyorum. lsKomut içeride düzenli dosyaları görünmüyor - sadece dizin listelerini de (ki mağaza dosya adları) ve düğüm (ki "tip" duygusu Daha önce de belirtildiği dahil mağaza meta).

Bu nedenle, lskomut, dosya türünü JPG resmi mi yoksa ikili dosya mı yoksa metin dosyası mı yoksa bir tür LibreOffice belgesi mi olduğu anlamında gösteremez, çünkü bu bilgiye sahip değildir.

Bunun için, singrium'un cevabının işaret fileettiği gibi, türlerini belirlemek için dosyaların içeriğinin ilk 50-100kB veya daha fazlasına bakan komuta ihtiyacınız vardır .


@Zana Bu bayrağa dikkatimi çektiğiniz için teşekkür ederim. Ben aradım (gerçek dosya türleri) olmasa da bu şimdilik yapardı. Bunun için oy vereceğim.
user10853

3

Dosya türlerinden biri, bir dosyanın normal bir dosya, dizin, aygıt, simge bağlantısı vb. Olup olmadığını lsseçenekler -lveya kullanarak gösterebilir -F.

  • Seçenek -l, dosya türünü bir girişin başında tek bir karakter olarak gösterir, örneğin:

    $ 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
    

    Nerede -normal bir dosya, dbir dizin ve lbir sembolik bağlantıdır.

  • Seçenek -F, dosya türünü bir sonek olarak gösterir, örneğin:

    $ ls -F
    DIR/ FILE LINK@
    

    Hiçbir sonek normal bir dosya, /bir dizin ve @bir sembolik bağlantıdır.

Bunlar hakkında daha fazla bilgiyi info coreutils 'ls invocation'burada bulabilirsiniz:

Şunun için -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

Şunun için -F:

nothing for regular files
‘*’ regular files that are executable
‘/’ directories
‘@’ symbolic links
‘|’ FIFOs
‘=’ sockets
‘>’ doors
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.