Listado de directorios solo usando ls en bash: un examen


Answers

Cuatro formas de hacerlo, cada una con un formato de salida diferente

1. Usando echo

Ejemplo: echo */ , echo */*/
Esto es lo que obtuve:

cs/ draft/ files/ hacks/ masters/ static/  
cs/code/ files/images/ static/images/ static/stylesheets/  

2. Usando ls solo

Ejemplo: ls -d */
Aquí es exactamente lo que obtuve:

cs/     files/      masters/  
draft/  hacks/      static/  

O como lista (con información detallada): ls -dl */

3. Usando ls y grep

Ejemplo: ls -l | grep "^d" ls -l | grep "^d" Esto es lo que obtuve:

drwxr-xr-x  24 h  staff     816 Jun  8 10:55 cs  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 draft  
drwxr-xr-x   9 h  staff     306 Jun  8 10:55 files  
drwxr-xr-x   2 h  staff      68 Jun  9 13:19 hacks  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 masters  
drwxr-xr-x   4 h  staff     136 Jun  8 10:55 static  

4. Bash Script (No se recomienda para el nombre de archivo contener espacio).

Ejemplo: for i in $(ls -d */); do echo ${i%%/}; done for i in $(ls -d */); do echo ${i%%/}; done
Esto es lo que obtuve:

cs  
draft  
files  
hacks  
masters  
static

Si desea tener '/' como carácter final, el comando será: for i in $(ls -d */); do echo ${i}; done for i in $(ls -d */); do echo ${i}; done

cs/  
draft/  
files/  
hacks/  
masters/  
static/
Question

Este comando enumera directorios en la ruta actual: ls -d */

¿Qué hace exactamente el patrón */ do?

¿Y cómo podemos dar la ruta absoluta en el comando anterior (por ejemplo, ls -d /home/alice/Documents ) para listar solo directorios en esa ruta?




para mostrar listas de carpetas sin /

ls -d */|sed 's|[/]||g'



file *|grep directory

O / P (en mi máquina) -

[root@rhel6 ~]# file *|grep directory
mongo-example-master:    directory
nostarch:                directory
scriptzz:                directory
splunk:                  directory
testdir:                 directory

La salida anterior puede refinarse más usando corte.

file *|grep directory|cut -d':' -f1
mongo-example-master
nostarch
scriptzz
splunk
testdir

* could be replaced with any path that's permitted
 file - determine file type
 grep - searches for string named directory
 -d - to specify a field delimiter
 -f1 - denotes field 1



El comando de tree también es bastante útil aquí. De forma predeterminada, mostrará todos los archivos y directorios a una profundidad completa, con algunos caracteres ascii que muestran el árbol de directorios.

$ tree
.
├── config.dat
├── data
│   ├── data1.bin
│   ├── data2.inf
│   └── sql
|   │   └── data3.sql
├── images
│   ├── background.jpg
│   ├── icon.gif
│   └── logo.jpg
├── program.exe
└── readme.txt

Pero si quisiéramos obtener solo los directorios, sin el árbol ascii, y con la ruta completa desde el directorio actual, podría hacer:

$ tree -dfi
.
./data
./data/sql
./images

Los argumentos son:

-d     List directories only.
-f     Prints the full path prefix for each file.
-i     Makes tree not print the indentation lines, useful when used in conjunction with the -f option.

Y si luego quiere la ruta absoluta, puede comenzar especificando la ruta completa al directorio actual:

$ tree -dfi "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/data/sql
/home/alice/Documents/images

Y para limitar el número de subdirectorios, puede establecer el nivel máximo de subdirectorios con el -L level , por ejemplo:

$ tree -dfi -L 1 "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/images

Se pueden ver más argumentos con el árbol del hombre




Acabo de agregar esto a mi archivo .bashrc (también podría simplemente escribirlo en la línea de comandos si solo lo necesita / desea para una sesión)

alias lsd='ls -ld */'

entonces lsd producirá el resultado deseado.




Pruebe si el elemento es un directorio con test -d :

for i in $(ls); do test -d $i && echo $i ; done



One-liner para listar directorios solo desde "aquí".

Con el conteo de archivos.

for i in `ls -d */`; do g=`find ./$i -type f -print| wc -l`; echo "Directory $i contains $g files."; done



Para todas las carpetas sin subcarpetas:

find /home/alice/Documents -maxdepth 1 -type d

Para todas las carpetas con subcarpetas:

find /home/alice/Documents -type d



FYI, si desea imprimir todos los archivos en varias líneas, puede hacer un ls -1 que imprimirá cada archivo en una línea separada. archivo1 archivo2 archivo3




Lo resolví parcialmente con:

cd "/path/to/pricipal/folder"

for i in $(ls -d .*/); do sudo ln -s "$PWD"/${i%%/} /home/inukaze/${i%%/}; done

ln: «/home/inukaze/./.»: can't overwrite a directory
ln: «/home/inukaze/../..»: can't overwrite a directory
ln: accesing to «/home/inukaze/.config»: too much symbolics links levels
ln: accesing to «/home/inukaze/.disruptive»: too much symbolics links levels
ln: accesing to «/home/inukaze/innovations»: too much symbolics links levels
ln: accesing to «/home/inukaze/sarl»: too much symbolics links levels
ln: accesing to «/home/inukaze/.e_old»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gnome2_private»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gvfs»: too much symbolics links levels
ln: accesing to «/home/inukaze/.kde»: too much symbolics links levels
ln: accesing to «/home/inukaze/.local»: too much symbolics links levels
ln: accesing to «/home/inukaze/.xVideoServiceThief»: too much symbolics links levels

Bueno, esto me reduce, la parte principal :)