ฉันจะแสดงประเภทไฟล์ด้วย ls ได้อย่างไร


12

ฉันไม่รู้ว่าlsมีความสามารถในการแสดงคอลัมน์ประเภทไฟล์หรือไม่

ทำการค้นหาออนไลน์อย่างรวดเร็วและค้นหาmanไม่ได้เปิดเผยความสามารถดังกล่าว มันสามารถทำสิ่งนี้ได้หรือไม่?

การชี้แจง: สิ่งนี้มีประโยชน์อย่างยิ่งหากไฟล์ไม่มีส่วนขยาย

ปรับปรุง

ตั้งแต่ 2018-04-28 คำตอบนั้นค่อนข้างน่าสนใจ แต่ก็ไม่ได้ให้สิ่งที่ฉันต้องการ โดยเฉพาะอย่างยิ่ง,

  • fileไม่ให้ filetypes ที่เกิดขึ้นจริง lsแต่ไม่ได้บูรณาการได้ดีกับ โดยเฉพาะฉันใช้ls -lhtrpG --group-directories-first --color=always

  • ls -Fเป็นlsวิธีการแก้ปัญหา แต่จะให้สัญลักษณ์ไม่ได้เป็นคอลัมน์ของประเภทไฟล์จริง

ด้วยเหตุนี้ฉันจึงไม่ได้ทำเครื่องหมายคำตอบใด ๆ ว่าเป็นคำตอบที่ฉันค้นหา



ข้อมูลที่เกี่ยวข้อง: สำหรับการอ่านของมนุษย์: ls -lahtrpF --group-directories-first --color=always /devหรือและอ่านโปรแกรมls -lsahG /dev ls -lsa /devดูman lsเอกสารประกอบสำหรับรายละเอียด
user1742529

คำตอบ:


16

fileเป็นตัวเลือกที่เหมาะสมในการรับข้อมูลประเภทไฟล์ที่คุณต้องการ หากต้องการรวมเอาท์พุทของมันกับที่lsฉันแนะนำให้ใช้find:

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

สิ่งนี้จะค้นหาไฟล์ทุกไฟล์ในไดเรกทอรีปัจจุบันและพิมพ์ผลลัพธ์ls -dilsเช่นเดียวกับผลลัพธ์ของfile -bมันแต่ละไฟล์ในบรรทัดของตัวเอง ตัวอย่างผลลัพธ์:

  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

แต่เนื่องจากคุณไม่ต้องการบรรทัด filetype แต่เป็นคอลัมน์ filetype ต่อไปนี้เป็นวิธีกำจัดอักขระบรรทัดใหม่ระหว่างบรรทัด:

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

ตัวอย่างผลลัพธ์:

-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

คอลัมน์ใหม่นั้นค่อนข้างยาวดังนั้นเราจะตัดทุกอย่างจากเครื่องหมายจุลภาคแรก:

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

ผลลัพธ์ของที่มีลักษณะเช่นนี้:

-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

มันไม่ค่อยมีประโยชน์เลยงั้นaliasเหรอ? ด้วยบรรทัดต่อไปนี้ใน~/.bash_aliasesไฟล์ของคุณคุณเพียงแค่ต้องเรียกใช้lsfเพื่อให้ได้ผลลัพธ์ข้างต้นสำหรับไดเรกทอรีปัจจุบัน

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

1
หากคุณใช้ฟังก์ชั่นแทนนามแฝงนั่นจะเป็นนรกน้อยกว่าและถ้าคุณใช้pasteหรือcolumnคุณสามารถจัดตำแหน่งได้ดีขึ้น: lsf () { find -maxdepth 1 -type f -exec bash -c 'column <(ls -l "$@") <(file -b "$@" | cut -d, -f1)' _ {} + ; }ปัญหาการจัดตำแหน่งไม่ชัดเจนในคำตอบเนื่องจากขนาดและวันที่ใกล้เคียงกัน (นอกจากนี้ยังจะเร็วขึ้นเล็กน้อยเนื่องจากคำสั่งจะถูกเรียกครั้งน้อยแทนการครั้งเดียวต่อไฟล์.)
Muru

@muru ขอบคุณสำหรับคำแนะนำดีๆมากมาย! columnaproach นี้เหมาะกับคุณหรือไม่? มันแค่พิมพ์เอาท์พุทของls -lสำหรับทุกไฟล์ตามด้วยfileเอาต์พุตของทุกไฟล์สำหรับฉันราวกับว่าเชลล์เพิ่งจะทำls -l "$@"; file -b "$@" | cut -d, -f1
ของหวาน

มันทำ paste.ubuntu.com/p/KjPthXPDPb - /etcส่วนบนจากนามแฝงและส่วนล่างคือฟังก์ชั่นทั้งสองวิ่งจาก
muru

ฉันคิดว่าฉันเห็นปัญหา - ถ้าcolumnเอาท์พุทไม่ได้ไปที่เทอร์มินัลคุณจำเป็นต้องระบุจำนวนคอลัมน์มิฉะนั้นมันจะเอาท์พุทไฟล์ทีละไฟล์ ดังนั้นcolumn -c "$COLUMNS" ...ควรทำงานในทั้งสองกรณี
muru

คุณกำลังเปิดตัว (อย่างน้อย?) 5 กระบวนการสำหรับแต่ละไฟล์ดังนั้นอาจเป็นไปได้ช้าเมื่อมีไฟล์จำนวนมากในไดเรกทอรี…
JanC

10

ฉันคิดว่าวิธีที่ดีที่สุดในการแสดงประเภทไฟล์คือการใช้คำสั่งนี้:

file <filename>

หากคุณต้องการแสดงรายการประเภทของไฟล์ทั้งหมดในไดเรกทอรีเพียงใช้:

file *

ตัวอย่าง <code> ไฟล์ * </code> จากคอมพิวเตอร์ของฉัน

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับอาร์กิวเมนต์ดูที่:

man file

แม้ว่าคำตอบนี้จะไม่ตอบคำถามของ OP โดยตรง แต่จะแสดงวิธีการค้นหาประเภทไฟล์ mime ที่ถูกต้องและควรทำเครื่องหมายเป็นคำตอบที่ถูกต้อง ในการรับmime typeเฉพาะใช้: file --mime-type filename.
Pedro Lobito

@PedroLobito ฉันคิดว่าคำถามที่เกี่ยวข้องอย่างใกล้ชิดครอบคลุมfileค่อนข้างดี แต่คำถามนี้แตกต่างกัน
ของหวาน

ฉันโหวตคำตอบนี้เพราะคุณเป็นคนแรกที่fileตอบคำถาม ในขณะที่ฉันตอบคนอื่น ๆ สิ่งนี้ไม่พอ (มันต้องบูรณาการกับ ls) ดังนั้นฉันจึงเก็บคะแนนไว้ ขอบคุณ.
user10853

1
ไฟล์ * เป็นคำตอบที่ดีที่สุด
tramada

1
file --mime /dev/*สำหรับรายการ mimes ในไดเรกทอรี / dev แทนปัจจุบัน
user1742529

7

เพื่อความชัดเจนฉันจะชี้ให้เห็นว่าคุณสามารถดูประเภทไฟล์ในลักษณะพื้นฐานด้วยการ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 -lแม้ว่า คำตอบของ wjandreaอธิบายในรายละเอียดเพิ่มเติม

แต่ฉันไม่คิดว่านี่คือสิ่งที่คุณหมายถึงตามประเภทไฟล์ lsคำสั่งไม่ได้ดูภายในไฟล์ปกติ - เฉพาะในรายชื่อไดเรกทอรี (ซึ่งเก็บชื่อไฟล์) และ inodes (ซึ่งเก็บข้อมูลเมตารวมทั้ง "พิมพ์" ในความหมายที่กล่าวถึงก่อนหน้านี้)

ดังนั้นlsคำสั่งไม่สามารถแสดงชนิดไฟล์ในแง่ของว่าเป็นรูปภาพ JPG หรือไฟล์ไบนารีหรือไฟล์ข้อความหรือเอกสาร LibreOffice บางชนิดเนื่องจากไม่มีข้อมูลนั้น

สำหรับสิ่งนั้นดังที่คำตอบของ singriumชี้ให้เห็นคุณจำเป็นต้องมีfileคำสั่งซึ่งจะดูเนื้อหา 50-100kB แรกหรือมากกว่านั้นเพื่อระบุประเภทของไฟล์


@Zana ขอบคุณที่ให้ความสนใจกับธงนี้ สิ่งนี้จะทำในตอนนี้แม้ว่ามันจะไม่ใช่สิ่งที่ฉันกำลังมองหา (ชนิดไฟล์จริง) สำหรับเรื่องนี้ฉันจะลงคะแนนให้
user10853

3

รูปแบบหนึ่งของประเภทไฟล์คือไฟล์เป็นไฟล์ไดเรกทอรีอุปกรณ์ symlink ฯลฯlsสามารถแสดงตัวเลือกนี้ได้-lหรือ-Fไม่

  • ตัวเลือก-lจะแสดงประเภทไฟล์เป็นอักขระเดียวเมื่อเริ่มต้นรายการเช่น:

    $ 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
    

    -เป็นไฟล์ปกติที่ไหนเป็นdไดเรกทอรีและlเป็น symlink

  • ตัวเลือก-Fจะแสดงประเภทไฟล์เป็นคำต่อท้ายเช่น:

    $ ls -F
    DIR/ FILE LINK@
    

    โดยที่ไม่มีคำต่อท้ายเป็นไฟล์ปกติ/เป็นไดเรกทอรีและ@เป็น symlink

ข้อมูลเพิ่มเติมเกี่ยวกับสิ่งเหล่านี้มีอยู่ในinfo coreutils 'ls invocation'รวมอยู่ที่นี่:

สำหรับ-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

สำหรับ-F:

nothing for regular files
‘*’ regular files that are executable
‘/’ directories
‘@’ symbolic links
‘|’ FIFOs
‘=’ sockets
‘>’ doors
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.