Як відобразити файл з ls?


12

Я не знаю, чи lsздатний відображати стовпчик файлів.

Швидкий пошук в Інтернеті та пошук manне виявили такої можливості. Чи здатний це робити?

Уточнення: Це особливо корисно, якщо файли не мають розширення.

Оновлення

Станом на 2018-04-28 відповіді були досить цікавими, проте вони не дали того, що я шукав. Більш конкретно,

  • fileдійсно надає фактичні файли, але це не добре інтегрується 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документацію.
користувач1742529

Відповіді:


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

Але, оскільки ви не хочете використовувати рядок файлового типу, а скоріше стовпець файлового типу , ось спосіб позбутися символу нової лінії між рядками:

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 Дякую за багато хороших пропозицій! Чи працює цей columnпідхід для вас? Він просто друкує вихід ls -lдля кожного файлу з подальшим fileвиведенням для кожного файлу для мене, як ніби оболонка просто зробить ls -l "$@"; file -b "$@" | cut -d, -f1
десерт

Це робить. paste.ubuntu.com/p/KjPthXPDPb - верхня частина - з псевдоніму, а нижня - функція, з якої обидва запущені /etc.
муру

Думаю, я бачу проблему - якщо columnвихід не до терміналу, вам потрібно вказати кількість стовпців, або він виведе файли один за одним; так column -c "$COLUMNS" ...має працювати в будь-якому випадку.
муру

Ви запускаєте (принаймні?) 5 процесів для кожного файлу, тож це, мабуть, буде повільним, коли в каталозі буде багато файлів…
JanC

10

Я думаю, що найкращим способом відображення типу файлів є використання цієї команди:

file <filename>

Якщо ви хочете перерахувати типи всіх файлів у каталозі, просто скористайтеся:

file *

<code> файл * </code> зразок з мого комп'ютера

Детальніше про аргументи див.

man file

Хоча ця відповідь не відповідає безпосередньо на запитання ОП, вона показує правильний спосіб пошуку типу файлу mime та має бути позначена як правильна відповідь. Для того, щоб отримати mime typeтільки, використання: file --mime-type filename.
CONvid19

@PedroLobito Я думаю, що тісно пов'язане питання охоплює fileдосить добре, але це питання інше.
десерт

Я голосую за цю відповідь, враховуючи те, що ви першими дали fileвідповідь. Як я відповів іншим, цього недостатньо (це потрібно інтегрувати з ls), тому я тримаю це під час голосування. Дякую.
користувач10853

1
файл * - найкраща відповідь
трамада

1
file --mime /dev/*для списку мімів у каталогу / 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Команда не шукає в звичайні файли - тільки в списках каталогів (які зберігають імена файлів) і дескриптори (які зберігають метадані, в тому числі «типу» в сенсі вже згадувалося раніше).

Отже, lsкоманда не може відображати тип файлу в сенсі того, чи є це зображення JPG, або двійковий файл, або текстовий файл або документ LibreOffice якогось типу, оскільки він не має такої інформації.

Для цього, як вказується у відповіді синріума , вам потрібна fileкоманда, яка розглядає перші 50-100 кБ або близько вмісту файлів, щоб визначити їх тип.


@Zana Дякую, що ви звернули мою увагу на цей прапор. Це зробило б це зараз, хоча це не те, що я шукав (фактичні файли). За це я проголосую.
користувач10853

3

Однією з форм є типом файлу , чи є файл звичайного файлу, каталог, пристрій, символічним і т.д. 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є посиланням.

  • Опція -Fвідображатиме тип файлу як суфікс, наприклад:

    $ ls -F
    DIR/ FILE LINK@
    

    Там, де жоден суфікс не є звичайним файлом, /це каталог та @є посиланням.

Більш детальна інформація про них доступна в 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.