Как я могу перечислить файлы по типу с помощью ls?


20

Когда я использую lsкоманду с параметром -l, первая строка букв дает информацию о каждом файле, а первая буква в этой строке указывает тип файла. ( d= каталог, -= стандартный файл, l= ссылка и т. д.)

Как я могу отфильтровать файлы по первой букве?


2
Подумайте, что вы хотите, это: superuser.com/a/109542
devnull

Ответы:


9

Вы можете отфильтровать все, кроме каталогов, используя grepэтот способ:

ls -l | grep '^d'

^указывает на то, что шаблон находится в начале строки. Замените dна -, lи т. Д., Если применимо.

Конечно, вы можете использовать другие команды для прямого поиска определенных типов (например find . -maxdepth 1 -type d) или использовать ls -l | sortдля группировки похожих типов вместе на основе этого первого символа, но если вы хотите фильтровать, вы должны использовать, grepчтобы выбрать только соответствующие строки из вывода.


Обратите внимание, что если у вас есть символические ссылки, вы можете использовать ls -lL. -Lбудет следовать символическим ссылкам, чтобы показать, связана ли она с каталогом или файлом.
Nux

8

Если вы хотите отобразить все выходные данные, но файлы одинакового типа перечислены вместе, вы можете отсортировать выходные данные по первому символу каждой строки:

ls -l | sort -k1,1

Есть ли причина для понижения?
Джозеф Р.

1
Вероятно, из-за использования процедуры обработки текста манипулирование простым текстом воспринимается как «не крутое» или «неправильное» среди определенных типов разработчиков (таких как большинство моих коллег ...). Получил ответ за простой и правильный ответ.
Марк К Коуэн

8

Команда lsимеет дело с именами файлов , которые записываются в каталог структур данных. Таким образом, он не заботится о самом файле, в том числе о «типе» файла.

Команда, которая больше подходит для работы с реальными файлами , а не только с их именами,find . У него есть опция, которая напрямую отвечает на ваш вопрос о том, как фильтровать список по типу файла.

Это дает список текущего каталога, похожего на ls -l:

find . -maxdepth 1 -ls

По умолчанию, findсписок каталогов рекурсивно, что отключается ограничением глубины поиска до 1.
Вы можете опустить ., но я включил его, чтобы показать, что каталоги должны быть перечислены перед опциями.

С помощью -typeвы можете фильтровать по типу файла, который выражается как fили dдля простых файлов или каталогов:

find . -maxdepth 1 -type d -ls

Существуют и другие значения фильтра -type, особенно lдля символических ссылок.
Обратите внимание, что с символическими ссылками есть сложность :
в этом случае существует два типа файла: с lуказанием символической ссылки и чем-то вроде f, с указанием типа файла, с которым связан. Есть варианты, чтобы указать, как справиться с этим, так что вы можете выбрать.


От man find:

    -type c
           File is of type c:

           b      block (buffered) special

           c      character (unbuffered) special

           d      directory

           p      named pipe (FIFO)

           f      regular file

           l      symbolic link; this is never true if the  -L  option
                  or  the -follow option is in effect, unless the sym‐
                  bolic link is broken.  If you  want  to  search  for
                  symbolic links when -L is in effect, use -xtype.

           s      socket

           D      door (Solaris)

и имеет отношение к обработке символических ссылок:

    -xtype c
           The  same as -type unless the file is a symbolic link.  For
           symbolic links: if the -H or -P option was specified,  true
           if the file is a link to a file of type c; if the -L option
           has been given, true if c is `l'.  In other words, for sym‐
           bolic  links, -xtype checks the type of the file that -type
           does not check.

и

    -P     Never follow symbolic links.  This is  the  default  behav‐
           iour.  When find examines or prints information a file, and
           the file is a symbolic link, the information used shall  be
           taken from the properties of the symbolic link itself.


    -L     Follow symbolic links.  When find examines or prints infor‐
           mation about files, the information  used  shall  be  taken
           from  the  properties of the file to which the link points,
           not from the link itself (unless it is  a  broken  symbolic
           link  or  find  is  unable to examine the file to which the
           link points).  Use of this option implies -noleaf.  If  you
           later  use  the -P option, -noleaf will still be in effect.
           If -L is in effect and find discovers a symbolic link to  a
           subdirectory during its search, the subdirectory pointed to
           by the symbolic link will be searched.

           When the -L option is in effect, the -type  predicate  will
           always  match  against the type of the file that a symbolic
           link points to rather than the link itself (unless the sym‐
           bolic  link  is  broken).   Using  -L causes the -lname and
           -ilname predicates always to return false.


    -H     Do not follow symbolic links, except while  processing  the
           command  line  arguments. [...]

2

Если вас больше всего беспокоит порядок папок из других типов файлов, вы можете пойти с

ls --group-directories-first

иначе, я думаю, что вы должны передать вывод из ls -l через sort или через grep, как ответил Anthon


2
ls -l | awk '/^d/{print $NF}

awk поймает все, что начинается с d. как d для каталога, и вам нужно напечатать последнее поле, чтобы вывести имя каталога


1
ls -l | sort 

Это отсортирует результат в алфавитном порядке для каждого результата. Если первый символ является критерием, который вы хотите, вот и все. Если вам нужны только имена файлов, вы можете попробовать:

ls -l | sort | cut -f 2 -d ' ' 

Или что-то подобное (эта команда сортирует, а затем разбивает каждую строку, используя разделитель пробелов, а затем возвращает вторую группу.


спасибо за редактирование Tico, трудно увидеть, что вы печатаете на телефоне.
Фабио
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.