¿Cómo puedo enumerar archivos por tipo con ls?

20

Cuando uso el lscomando con la opción -l, la primera cadena de letras proporciona la información sobre cada archivo, y la primera letra de esta cadena proporciona el tipo de archivo. ( d= directorio, -= archivo estándar, l= enlace, etc.)

¿Cómo puedo filtrar los archivos de acuerdo con esa primera letra?

dziadek1990
fuente
2
Piense lo que quiere es la siguiente: superuser.com/a/109542
devnull

Respuestas:

9

Puede filtrar todo menos los directorios de grepesta manera:

ls -l | grep '^d'

el ^indica que el patrón está al comienzo de la línea. Reemplazar dcon -, l, etc., según sea el caso.

Por supuesto, puede usar otros comandos para buscar directamente tipos específicos (por ejemplo find . -maxdepth 1 -type d) o usar ls -l | sortpara agrupar tipos similares en función de este primer carácter, pero si desea filtrar, debe usar greppara seleccionar solo las líneas apropiadas de la salida.

Anthon
fuente
Tenga en cuenta que si tiene enlaces simbólicos es posible que desee utilizar ls -lL. -Lseguirá los enlaces simbólicos para mostrar si está vinculado a un directorio o un archivo.
Nux
8

Si desea mostrar toda la salida pero tiene archivos de tipo similar listados juntos, puede ordenar la salida en el primer carácter de cada línea:

ls -l | sort -k1,1
Joseph R.
fuente
¿Alguna razón para el voto negativo?
Joseph R.
1
Probablemente debido al uso de una rutina de procesamiento de texto, la manipulación de texto sin formato se percibe como "poco atractiva" o "incorrecta" entre ciertos tipos de desarrolladores (como la mayoría de mis colegas ...). Dado un voto positivo por una respuesta simple y correcta.
Mark K Cowan
8

El comando lstrata con nombres de archivos , que se registran en las estructuras de datos del directorio. Por lo tanto, realmente no le importa el archivo en sí, incluido el "tipo" de un archivo.

Un comando que es más adecuado para trabajar en archivos reales , no solo sus nombres, es find. Tiene una opción que responde directamente a su pregunta sobre cómo filtrar la lista por tipo de archivo.

Esto proporciona una lista del directorio actual similar a ls -l:

find . -maxdepth 1 -ls

De manera predeterminada, findenumera los directorios de forma recursiva, lo que se desactiva al limitar la profundidad de búsqueda a 1.
Puede omitir el ., pero lo incluí para mostrar que los directorios deben aparecer antes de las opciones.

Con -type, puede filtrar por tipo de archivo, que se expresa como fo dpara archivos o directorios simples:

find . -maxdepth 1 -type d -ls

Hay otros valores de filtro para -type, especialmente lpara enlaces simbólicos.
Tenga en cuenta que hay una complicación con los enlaces simbólicos :
en este caso l, hay dos tipos de archivo: indicando un enlace simbólico y algo parecido f, indicando el tipo de archivo vinculado. Hay opciones para especificar cómo manejar eso, para que pueda elegir.


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

y relevante para el manejo de enlaces simbólicos:

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

y

    -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. [...]
Volker Siegel
fuente
2

Si está más preocupado por ordenar las carpetas de los otros tipos de archivos, puede ir con

ls --group-directories-first

de lo contrario, creo que tiene que canalizar la salida de ls -l a través de sort o grep como respondió Anthon

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

awk atrapará todo lo que comience con d. como d es para el directorio y necesita imprimir el último campo para enumerar el nombre del directorio

Adicto al alcohol
fuente
1
ls -l | sort 

Esto ordenará el resultado de acuerdo con el orden alfabético de cada resultado. Si el primer personaje es el criterio que desea, eso es todo. Si solo necesita los nombres de archivo, puede probar:

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

O algo similar (ese comando ordena y luego divide cada línea usando el delimitador de espacio, luego devuelve el segundo grupo.

Fabio
fuente
gracias por la edición de Tico, es difícil ver lo que escribes en el teléfono.
Fabio