Як я можу перерахувати файли за типом 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 через сортування або через grep, як відповів Ентон


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.