Làm cách nào để hiển thị filetype với ls?


12

Tôi không biết liệu lscó khả năng hiển thị một cột filetype hay không.

Thực hiện tìm kiếm trực tuyến nhanh và tìm kiếm mankhông cho thấy khả năng như vậy. Có khả năng làm điều này?

Làm rõ: Điều này đặc biệt hữu ích nếu các tệp không có phần mở rộng.

Cập nhật

Kể từ 2018-04-28, các câu trả lời khá thú vị tuy nhiên chúng không cung cấp những gì tôi đang tìm kiếm. Cụ thể hơn,

  • filekhông cung cấp cho các kiểu tệp thực tế nhưng nó không tích hợp tốt với ls. Cụ thể, tôi sử dụngls -lhtrpG --group-directories-first --color=always

  • ls -Flà một lsgiải pháp tuy nhiên nó cung cấp các ký hiệu không phải là một cột của các kiểu tệp thực tế.

Vì lý do này, tôi đã không đánh dấu bất kỳ câu trả lời nào là câu trả lời tôi đang tìm kiếm.



thông tin liên quan: cho người có thể đọc được: ls -lahtrpF --group-directories-first --color=always /devhoặc ls -lsahG /dev, và cho chương trình có thể đọc được ls -lsa /dev. xem man lstài liệu để biết chi tiết.
dùng1742529

Câu trả lời:


15

filechắc chắn là lựa chọn đúng đắn để có được thông tin loại tệp bạn muốn. Để kết hợp đầu ra của nó với đầu ra của lstôi, tôi khuyên bạn nên sử dụng find:

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

Điều này tìm thấy mọi tệp trong thư mục hiện tại và in đầu ra ls -dilscũng như đầu ra của file -bnó, mỗi tệp trên một dòng riêng. Ví dụ đầu ra:

  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

Nhưng, vì bạn không muốn có một dòng filetype mà là một cột filetype , đây là một cách để loại bỏ ký tự dòng mới giữa các dòng:

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

Đầu ra mẫu:

-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

Cột mới đó khá dài, vì vậy hãy cắt mọi thứ từ dấu phẩy đầu tiên:

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

Đầu ra của nó trông như thế này:

-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

Điều này không hoàn toàn tiện dụng, vậy còn một alias? Với dòng sau trong ~/.bash_aliasestệp của bạn, bạn chỉ cần chạy lsfđể có được đầu ra ở trên cho thư mục hiện tại.

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

1
Nếu bạn sử dụng một hàm thay vì bí danh, đó sẽ không phải là địa ngục trích dẫn và nếu bạn sử dụng pastehoặc column, bạn có thể có sự liên kết tốt hơn: lsf () { find -maxdepth 1 -type f -exec bash -c 'column <(ls -l "$@") <(file -b "$@" | cut -d, -f1)' _ {} + ; }Vấn đề căn chỉnh không rõ ràng trong câu trả lời vì kích thước và ngày tương tự. (Điều này cũng sẽ nhanh hơn một chút, vì các lệnh sẽ được gọi ít lần hơn thay vì một lần cho mỗi tệp.)
muru

@muru Cảm ơn rất nhiều lời đề nghị hay! Liệu columnaproach này làm việc cho bạn? Nó chỉ in sản lượng ls -lcho mỗi tập tin tiếp theo filecủa đầu ra cho mỗi tập tin cho tôi, như thể vỏ chỉ sẽ làm ls -l "$@"; file -b "$@" | cut -d, -f1...
món tráng miệng

Nó làm. paste.ubfox.com/p/KjPthXPDPb - phần trên cùng là từ bí danh và phần dưới cùng là chức năng, cả hai đều chạy từ /etc.
muru

Tôi nghĩ rằng tôi thấy vấn đề - nếu columnđầu ra không đến thiết bị đầu cuối, bạn cần chỉ định số lượng cột hoặc nó sẽ xuất các tệp lần lượt; vì vậy column -c "$COLUMNS" ...nên làm việc trong cả hai trường hợp.
muru

Bạn đang khởi chạy (ít nhất?) 5 quy trình cho mỗi tệp, vì vậy việc này có thể sẽ chậm khi có nhiều tệp trong thư mục
giật

10

Tôi nghĩ rằng cách tốt nhất để hiển thị một loại tệp là sử dụng lệnh này:

file <filename>

Nếu bạn muốn liệt kê các loại của tất cả các tệp trong một thư mục, chỉ cần sử dụng:

file *

mẫu <code> tệp * </ code> từ máy tính của tôi

Để biết thêm chi tiết về các đối số, xem:

man file

Mặc dù câu trả lời này không trả lời trực tiếp cho câu hỏi của OP, nhưng nó cho thấy cách chính xác để tìm loại mime của tệp và phải được đánh dấu là câu trả lời đúng. Để có được mime typeduy nhất, sử dụng : file --mime-type filename.
Pedro lobito

@PedroLobito Tôi nghĩ rằng câu hỏi liên quan chặt chẽ bao gồm filekhá tốt, nhưng câu hỏi này là khác nhau.
tráng miệng

Tôi bỏ phiếu cho câu trả lời này vì bạn là người đầu tiên đưa ra filecâu trả lời. Như tôi đã trả lời cho những người khác, điều này không đủ (nó cần được tích hợp với ls) vì vậy tôi giữ nó ở mức bỏ phiếu. Cảm ơn bạn.
dùng10853

1
tập tin * là câu trả lời hay nhất
tramada

1
file --mime /dev/*cho danh sách mimes trong thư mục / dev thay vì hiện tại
user1742529

7

Để rõ ràng, tôi sẽ chỉ ra rằng bạn có thể thấy loại tệp theo nghĩa cơ bản với ls, sử dụng -Fcờ (phân loại) nối thêm ký hiệu vào tên tệp tùy thuộc vào loại tệp:

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

Tuy nhiên, bạn có thể thấy thông tin đó ít được hiển thị bằng mật mã trong chữ cái đầu tiên của đầu ra ls -l. Câu trả lời của wjandrea mô tả điều này chi tiết hơn.

Nhưng tôi không nghĩ đây là ý của bạn theo loại tệp. Các lslệnh không giống các file bên trong thường xuyên - chỉ ở danh sách thư mục (trong đó lưu trữ tên tập tin) và các inode (mà cửa hàng siêu dữ liệu, bao gồm cả "loại" theo nghĩa đề cập trước đó).

Vì vậy, lslệnh không thể hiển thị loại tệp theo nghĩa là hình ảnh JPG hoặc tệp nhị phân hoặc tệp văn bản hoặc tài liệu LibreOffice thuộc loại nào đó, vì nó không có thông tin đó.

Vì thế, như câu trả lời của người độc thân chỉ ra, bạn cần có filelệnh, xem xét nội dung 50-100kB đầu tiên hoặc hơn nội dung của tệp để xác định loại của chúng.


@Zana Cảm ơn bạn đã nâng cao sự chú ý của tôi đến lá cờ này. Điều này sẽ làm điều đó ngay bây giờ mặc dù nó không phải là những gì tôi đang tìm kiếm (filetypes thực tế). Đối với điều này, tôi sẽ bỏ phiếu lên.
user10853

3

Một dạng của filetype là liệu một tệp là một tệp thông thường, thư mục, thiết bị, symlink, v.v. lscó thể hiển thị điều này bằng các tùy chọn -lhoặc -F.

  • Tùy chọn -lsẽ hiển thị kiểu tệp dưới dạng một ký tự khi bắt đầu danh sách, ví dụ:

    $ 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
    

    Trường hợp -là một tệp thông thường, dlà một thư mục và llà một liên kết tượng trưng.

  • Tùy chọn -Fsẽ hiển thị kiểu tệp dưới dạng hậu tố, ví dụ:

    $ ls -F
    DIR/ FILE LINK@
    

    Trường hợp không có hậu tố là một tệp thông thường, /là một thư mục và @là một liên kết tượng trưng.

Thông tin thêm về những điều này có sẵn trong info coreutils 'ls invocation', tóm tắt ở đây:

Dành cho -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

Dành cho -F:

nothing for regular files
‘*’ regular files that are executable
‘/’ directories
‘@’ symbolic links
‘|’ FIFOs
‘=’ sockets
‘>’ doors
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.