Как я отображаю тип файла с ls?

Я не осведомлен относительно ли ls способно к отображению столбца типа файла.

Выполнение быстрого поиска онлайн и поиск man не показал такую возможность. Действительно ли это способно к выполнению этого?

Разъяснение: Это особенно полезно, если файлы не имеют расширения.

Обновление

С 28.04.2018 ответы были довольно интересны однако, они не обеспечили то, что я искал. Строго говоря,

  • file действительно дает фактические типы файлов, но это не интегрируется хорошо с ls. А именно, я использую ls -lhtrpG --group-directories-first --color=always

  • ls -F ls решение однако это обеспечивает символы не столбец фактических типов файлов.

Поэтому я не отметил ни одного из ответов как ответ, который я ищу.

10
задан 29 April 2018 в 15:00

4 ответа

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" \;'
12
ответ дан 23 November 2019 в 04:17

Для ясности я собираюсь указать, что Вы видите тип файла в основном смысле с 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 или так содержания файлов для определения их типа.

7
ответ дан 23 November 2019 в 04:17

Я думаю, что лучший способ отобразить тип файла использует эту команду:

file <filename>

Если Вы хотите перечислить типы всех файлов в каталоге, просто используйте:

file *

<code>file *</code> sample from my computer

Для получения дополнительной информации об аргументах, см.:

man file
9
ответ дан 23 November 2019 в 04:17

Одна форма типа файла - является ли файл регулярным файлом, каталогом, устройством, символьной ссылкой, и т.д. 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
3
ответ дан 23 November 2019 в 04:17

Другие вопросы по тегам:

Похожие вопросы: