Jak mogę wyświetlić listę plików według typu za pomocą ls?


20

Kiedy używam lspolecenia z opcją -l, pierwszy ciąg liter podaje informacje o każdym pliku, a pierwsza litera w tym ciągu określa typ pliku. ( d= katalog, -= standardowy plik, l= link itp.)

Jak mogę filtrować pliki według tej pierwszej litery?


2
Pomyśl, co chcesz: superuser.com/a/109542
devnull

Odpowiedzi:


9

W grepten sposób możesz odfiltrować wszystko oprócz katalogów :

ls -l | grep '^d'

^wskazuje, że wzór jest na początku linii. Wymień dsię -, litp, jak zastosowanie.

Możesz oczywiście użyć innych poleceń do bezpośredniego wyszukiwania określonych typów (np. find . -maxdepth 1 -type d) Lub użyć ls -l | sortdo grupowania podobnych typów razem na podstawie tego pierwszego znaku, ale jeśli chcesz filtrować, powinieneś użyć greptylko do wybrania odpowiednich linii z wyniku.


Zauważ, że jeśli masz dowiązania symboliczne, z których możesz skorzystać ls -lL. -Lbędzie podążać za dowiązaniami symbolicznymi, aby pokazać, czy jest on powiązany z katalogiem lub plikiem.
Nux

8

Jeśli chcesz wyświetlić wszystkie dane wyjściowe, ale jednocześnie wyświetlić pliki tego samego typu, możesz posortować dane wyjściowe według pierwszego znaku każdego wiersza:

ls -l | sort -k1,1

Czy jest jakiś powód do głosowania?
Joseph R.

1
Prawdopodobnie ze względu na użycie procedury przetwarzania tekstu manipulowanie zwykłym tekstem jest postrzegane przez niektórych programistów (takich jak większość moich kolegów ...) jako „niechłodzone” lub „złe” . Biorąc pod uwagę poparcie dla prostej i poprawnej odpowiedzi.
Mark K Cowan

8

Polecenie lsdotyczy nazw plików , które są zapisywane w strukturach danych katalogu. Więc tak naprawdę nie obchodzi go sam plik, w tym „typ” pliku.

Polecenie, które jest bardziej odpowiednie do pracy na rzeczywistych plikach , nie tylko na ich nazwach, to find. Ma opcję, która bezpośrednio odpowiada na pytanie, jak filtrować listę według typu pliku.

Daje to listę bieżącego katalogu podobną do ls -l:

find . -maxdepth 1 -ls

Domyślnie findlista katalogów jest rekurencyjnie, co jest wyłączone przez ograniczenie głębokości wyszukiwania do 1.
Możesz pominąć ., ale dodałem go, aby pokazać, że katalogi muszą być wymienione przed opcjami.

Dzięki -type, można filtrować według typu pliku, który jest wyrażony jako flub ddo zwykłych plików lub katalogów:

find . -maxdepth 1 -type d -ls

Istnieją inne wartości filtrów dla -type, w szczególności ldla dowiązań symbolicznych.
Zauważ, że istnieje komplikacja z dowiązaniami symbolicznymi :
W tym przypadku istnieją dwa typy plików: lwskazujące dowiązanie symboliczne i coś podobnego f, wskazujące typ pliku, do którego jest podłączony link. Istnieją opcje określające sposób obsługi tego, abyś mógł wybrać.


Od 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)

i istotne dla obsługi linków symbolicznych:

    -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.

i

    -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

Jeśli najbardziej martwi Cię zamawianie folderów z innych typów plików, możesz użyć

ls --group-directories-first

w przeciwnym razie myślę, że musisz przesłać dane wyjściowe z ls -l przez sort lub grep, jak odpowiedział Anthon


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

awk złapie wszystko, co zaczyna się na d. jak d jest dla katalogu i musisz wydrukować ostatnie pole, aby wyświetlić nazwę katalogu


1
ls -l | sort 

Spowoduje to sortowanie wyniku według kolejności alfabetycznej każdego wyniku. Jeśli pierwszy znak jest kryterium, które chcesz, to tyle. Jeśli potrzebujesz tylko nazw plików, możesz spróbować:

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

Lub coś podobnego (to polecenie sortuje, a następnie dzieli każdą linię za pomocą separatora spacji, a następnie zwraca drugą grupę.


dzięki za edycję Tico, ciężko jest zobaczyć, co piszesz w telefonie.
Fabio
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.