Quiero enumerar solo los directorios en la ruta especificada ( ls
no tiene esa opción). Además, ¿se puede hacer esto con un solo comando de línea?
Quiero enumerar solo los directorios en la ruta especificada ( ls
no tiene esa opción). Además, ¿se puede hacer esto con un solo comando de línea?
Respuestas:
Pruebe esto ls -d */
para enumerar directorios dentro del directorio actual
ls -al | grep '^d'
, esto es mucho más sucinto.
*/
obliga a mostrar solo los elementos que terminan con una barra diagonal, que en este caso sería un directorio, incluso si no se utiliza la -F
opción de ls
. Similar al comportamiento de ls *php
y cómo muestra todos los archivos que terminan php
en un directorio.
echo */
haré lo mismo también
Prueba esto:
find . -maxdepth 1 -type d
ls
soluciones sugeridas , find
es el único responsable de hacer el trabajo (no depender de la expansión de comodines de shell, que puede imponer límites). También es mucho más conciso.
find * -maxdepth 0 -type d
.
find
generalmente hace pero solo muestra las carpetas en profundidad 1.
El seguimiento
find * -maxdepth 0 -type d
básicamente filtra la expansión de '*', es decir, todas las entradas en el directorio actual, por la -type d
condición.
La ventaja es que la salida es la misma ls -1 *
, pero solo con directorios y entradas que no comienzan con un punto
Puedes usar ls -d */
otree -d
Otra solución sería globbing, pero esto depende del shell que esté utilizando y si se admite globbing para directorios.
Por ejemplo ZSH:
zsh # ls *(/)
tree
?
tree
no está instalada por defecto (aunque está en los repositorios).
tree
comando no es un comando nativo de Unix ( corrígeme si me equivoco).
Dado que hay docenas de formas de hacerlo, aquí hay otra:
tree -d -L 1 -i --noreport
tree -d -L 1 -i --noreport | tail -n +2
tree -C -d -L 1 -i --noreport | tail -n+2
ls -l | grep '^d'
Puedes hacer un alias y ponerlo en el archivo de perfil
alias ld="ls -l| grep '^d'"
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'
use esto para obtener una lista de directorio
ls -d */ | sed -e "s/\///g"
find specifiedpath -type d
Si no desea recurrir en subdirectorios, puede hacerlo en su lugar:
find specifiedpath -type d -mindepth 1 -maxdepth 1
Tenga en cuenta que los directorios "punto" (cuyo nombre comienza con .
) también aparecerán en la lista; pero no los directorios especiales .
ni ..
. Si no desea directorios de "puntos", puede simplemente grep
eliminarlos:
find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'
mindepth
que debes deshacerte .
! 😁
La respuesta dependerá de su caparazón .
En zsh
, por ejemplo, puede hacer lo siguiente:
echo *(/)
Y se mostrarán todos los directorios dentro del directorio de trabajo actual.
Ver man zshexpn
para más información.
Un enfoque alternativo sería el uso find(1)
, que debería funcionar en la mayoría de los sabores de Unix:
find . -maxdepth 1 -type d -print
find(1)
tiene muchos usos, por lo que definitivamente lo recomendaría man find
.
Puede usar el tree
comando con su d
interruptor para lograr esto.
% tree -d tstdir
tstdir
|-- d1
| `-- d11
| `-- d111
`-- d2
`-- d21
`-- d211
6 directories
ver man tree
para más información.
tree
. Oh, bueno, no era mi intención robar el trueno de nadie.
Si tengo este directorio:
ls -l
lrwxrwxrwx 1 nagios nagios 11 août 2 18:46 conf_nagios -> /etc/icinga
-rw------- 1 nagios nagios 724930 août 15 21:00 dead.letter
-rw-r--r-- 1 nagios nagios 12312 août 23 00:13 icinga.log
-rw-r--r-- 1 nagios nagios 8323 août 23 00:12 icinga.log.gz
drwxr-xr-x 2 nagios nagios 4096 août 23 16:36 tmp
Para obtener todos los directorios, use -L para resolver enlaces:
ls -lL | grep '^d'
drwxr-xr-x 5 nagios nagios 4096 août 15 21:22 conf_nagios
drwxr-xr-x 2 nagios nagios 4096 août 23 16:41 tmp
Sin -L:
ls -l | grep '^d'
drwxr-xr-x 2 nagios nagios 4096 août 23 16:41 tmp
Falta el directorio conf_nagios .
Esto ha estado funcionando para mí:
`ls -F | grep /`
(Pero, me estoy cambiando echo */
según lo mencionado por @nos)
Aquí hay otra solución que muestra los directorios vinculados. Lo prefiero un poco porque es un subconjunto de la salida ls -l "normal":
ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always
En bash:
ls -d */
Listará todos los directorios
ls -ld */
enumerará todos los directorios en forma larga
ls -ld */ .*/
enumerará todos los directorios, incluidos los directorios ocultos, en forma larga.
Recientemente cambié a zsh (MacOS Catalina) y descubrí que:
ls -ld */ .*/
ya no funciona si el directorio actual no contiene directorios ocultos.
zsh: no matches found: .*/
Imprimirá el error anterior, pero tampoco imprimirá ningún directorio.
ls -ld *(/) .*(/)
También falla de la misma manera.
Hasta ahora he encontrado que esto:
ls -ld */;ls -ld .*/
Es una solución decente. El ;
es un separador de comandos. Pero significa que si no hay directorios ocultos, enumerará los directorios y aún imprimirá el error para ningún directorio oculto:
foo
bar
zsh: no matches found: .*/
ls
es el comando shell de contenido de la lista de directorio actual
-l
es el indicador para especificar que desea a la lista en Longford (un elemento por línea + un montón de otra información fresca)
-d
es la bandera para listar todos los directorios "como archivos" y no de forma recursiva
*/
es el argumento 'enumerar todos los archivos que terminan en una barra inclinada'
*
es un simple comando regex para "cualquier cosa", por lo que */
le pide al shell que enumere "cualquier cosa que termine en '/'"
Ver man ls
para más información.
Pongo esto:
alias lad="ls -ld */;ls -ld .*/"
en mi .zshrc, y parece funcionar bien.
NOTA: también he descubierto que
ls -ld .*/ 2> /dev/null
no funciona, ya que todavía imprime esterr en la terminal. Actualizaré mi respuesta si / cuando encuentre una solución.
Para enumerar solo directorios en una ruta especificada, simplemente escriba ls -l | grep drw
drw
, y excluiría cualquier directorio que no sea legible y escribible por el propietario. grep ^d
Funciona mejor
Lista larga de directorios
Listado de directorios
- ls -d * /