Я не осведомлен относительно ли ls
способно к отображению столбца типа файла.
Выполнение быстрого поиска онлайн и поиск man
не показал такую возможность. Действительно ли это способно к выполнению этого?
Разъяснение: Это особенно полезно, если файлы не имеют расширения.
Обновление
С 28.04.2018 ответы были довольно интересны однако, они не обеспечили то, что я искал. Строго говоря,
file
действительно дает фактические типы файлов, но это не интегрируется хорошо с ls
. А именно, я использую ls -lhtrpG --group-directories-first --color=always
ls -F
ls
решение однако это обеспечивает символы не столбец фактических типов файлов.
Поэтому я не отметил ни одного из ответов как ответ, который я ищу.
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" \;'
Для ясности я собираюсь указать, что Вы видите тип файла в основном смысле с 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 или так содержания файлов для определения их типа.
Я думаю, что лучший способ отобразить тип файла использует эту команду:
file <filename>
Если Вы хотите перечислить типы всех файлов в каталоге, просто используйте:
file *
Для получения дополнительной информации об аргументах, см.:
man file
Одна форма типа файла - является ли файл регулярным файлом, каталогом, устройством, символьной ссылкой, и т.д. 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