Este comando enumera los directorios en la ruta actual: ls -d */
¿Qué hace exactamente el patrón */
?
¿Y cómo podemos dar la ruta absoluta en el comando anterior (por ejemplo ls -d /home/alice/Documents
) para enumerar solo directorios en esa ruta?
-d
realmente significa.Respuestas:
*/
es un patrón que coincide con todos los subdirectorios en el directorio actual (*
coincidiría con todos los archivos y subdirectorios; lo/
restringe a los directorios). Del mismo modo, para enumerar todos los subdirectorios en / home / alice / Documents, usels -d /home/alice/Documents/*/
fuente
*/
no coincidirá con ninguna carpeta oculta. Para incluirlos, especifíquelos explícitamente comols -d .*/ */
, o configure ladotglob
opción en Bash.ls
algo que no existe.shopt -s nullglob
ls */
se expandiría a solols
, lo que enumeraría todos los archivos en el directorio actual. Estoy bastante seguro de que eso no es lo que quieres en ese caso.Cuatro formas de hacer esto, cada una con un formato de salida diferente
1. Usando
echo
Ejemplo:
echo */
,echo */*/
Aquí es lo que tengo:
2. Usando
ls
soloEjemplo: esto
ls -d */
es exactamente lo que obtuve:
O como lista (con información detallada):
ls -dl */
3. Usando
ls
ygrep
Ejemplo: esto
ls -l | grep "^d"
es lo que obtuve:4. Bash Script (no recomendado para nombres de archivo que contienen espacios)
Ejemplo: esto
for i in $(ls -d */); do echo ${i%%/}; done
es lo que obtuve:
Si desea tener '/' como carácter final, el comando será:
for i in $(ls -d */); do echo ${i}; done
fuente
3
fue notablemente más lento que los demás para mí. En el directorio que probé:1
.012s,2
.016s,3
.055s ,4
.021s.1
es mi favorito.time
, la función Unix. /// Estoy de acuerdo,echo */
es más inteligente quels -d */
.1.
opción causará grandes dolores al tratar con nombres de carpetas que tienen espacios.Yo suelo:
Esto crea una sola columna sin barra diagonal - útil en scripts.
Mis dos centavos.
fuente
-1
opción parals
saldrá también en formato de columna única, como enls -1 -d */
.-1
aún genera una barra diagonal final para cada entrada..bashrc
como alias, ¿cómo agrego'/'
?'\/'
| sed -e 's-/$--'
Para todas las carpetas sin subcarpetas:
Para todas las carpetas con subcarpetas:
fuente
find /home/alice/Documents -maxdepth 1 -mindepth 1 -type d
contrario, se incluye a/home/alice/Documents
sí mismo. Para incluir enlaces simbólicos a directorios, prefijo con-L
4 (más) Opciones confiables.
Un asterisco sin comillas
*
será interpretado como un patrón (glob) por el shell.El shell lo usará en la expansión del nombre de ruta.
Luego generará una lista de nombres de archivo que coinciden con el patrón.
Un asterisco simple coincidirá con todos los nombres de archivo en el PWD (directorio de trabajo actual).
Un patrón más complejo
*/
que coincidirá con todos los nombres de archivo que terminan en/
.Por lo tanto, todos los directorios. Por eso el comando:
1.- eco.
se expandirá (por el shell) a
echo
todos los directorios en el PWD.Para probar esto: Cree un directorio (
mkdir
) llamado como test-dir, ycd
en él:Crea algunos directorios:
El comando
echo ./*/
seguirá siendo confiable incluso con archivos con nombres impares:Pero los espacios en los nombres de archivo hacen que la lectura sea un poco confusa.
Si en lugar de
echo
usarls
, el shell sigue siendo lo que está expandiendo la lista de nombres de archivo. El shell es la razón para obtener una lista de directorios en el PWD. La-d
opción parals
hacer que enumere la entrada del directorio actual en lugar de los contenidos de cada directorio (como se presenta por defecto).Sin embargo, este comando es (algo) menos confiable. Fallará con los archivos con nombres impares enumerados anteriormente. Se ahogará con varios nombres. Necesita borrar uno por uno hasta que encuentre los que tengan problemas.
2.- ls
La GNU
ls
aceptará la--
tecla "fin de opciones" ( ).3.-printf
Para enumerar cada directorio en su propia línea (en una columna, similar a ls -1), use:
Y, aún mejor, podríamos eliminar el final
/
:Un intento como este:
Fallará en:
ls -d */
) como ya se muestra arriba.IFS
.IFS
).4.- Función
Finalmente, el uso de la lista de argumentos dentro de una función no afectará la lista de argumentos del actual shell en ejecución. Simplemente:
presenta esta lista:
Estas opciones son seguras con varios tipos de nombres de archivo extraños.
fuente
El
tree
comando 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.Pero si quisiéramos obtener solo los directorios, sin el árbol ascii, y con la ruta completa desde el directorio actual, podría hacer:
Los argumentos son:
Y si luego desea la ruta absoluta, puede comenzar especificando la ruta completa al directorio actual:
Y para limitar el número de subdirectorios, puede establecer el nivel máximo de subdirectorios con
-L level
, por ejemplo:Se pueden ver más argumentos con man tree
fuente
En caso de que se pregunte por qué la salida de 'ls -d * /' le proporciona dos barras diagonales finales, como:
Probablemente se deba a que en algún lugar sus archivos de configuración de shell o sesión alias el comando ls a una versión de ls que incluye el indicador -F. Esa bandera agrega un carácter a cada nombre de salida (que no es un archivo simple) que indica el tipo de cosa que es. Entonces, una barra oblicua coincide con el patrón '* /', y la otra barra oblicua es el indicador de tipo adjunto.
Para deshacerse de este problema, por supuesto, podría definir un alias diferente para ls. Sin embargo, para no invocar temporalmente el alias, puede anteponer el comando con una barra diagonal inversa:
\ ls -d * /
fuente
Solo agrego esto a mi
.bashrc
archivo (también puede escribirlo en la línea de comando si solo lo necesita / desea para una sesión)entonces lsd producirá el resultado deseado.
fuente
ls
Solución real , incluidos enlaces simbólicos a directoriosMuchas respuestas aquí en realidad no usan
ls
(o solo lo usan en el sentido trivial dels -d
, mientras usan comodines para la coincidencia real del subdirectorio. Unals
solución verdadera es útil, ya que permite el uso dels
opciones para ordenar el orden, etc.Excluyendo enlaces simbólicos
Se
ls
ha dado una solución usando , pero hace algo diferente de las otras soluciones, ya que excluye enlaces simbólicos a directorios:(posiblemente canalizando
sed
oawk
para aislar los nombres de archivo)Incluyendo enlaces simbólicos
En el caso (probablemente más común) de que se deben incluir enlaces simbólicos a directorios, podemos usar la
-p
opción dels
, lo que hace que agregue un carácter de barra diagonal a los nombres de directorios (incluidos los enlaces simbólicos):o, deshacerse de las barras diagonales finales:
Podemos agregar opciones
ls
según sea necesario (si se usa una lista larga,-1
ya no es necesaria).nota: si queremos barras diagonales finales, pero no queremos que se destaquen
grep
, podemos eliminar el resaltado hackeando la parte correspondiente de la línea vacía:fuente
Si no es necesario incluir el directorio oculto, ofrezco:
Y si se necesitan directorios ocultos para ser listados, use:
O
fuente
awk
, mire esta respuestapara mostrar listas de carpetas sin
/
fuente
ls -d1 */ | tr -d "/"
set -- */; printf "%s\n" "${@%/}"
Esto es lo que estoy usando
ls -d1 /Directory/Path/*;
fuente
ls -d1 /Directory/Path/*/
Para listar solo directorios :
para listar solo archivos :
o también puedes hacer lo siguiente: ls -ld * /
fuente
Pruebe si el elemento es un directorio con
test -d
:fuente
*/
es un patrón de coincidencia de nombre de archivo que coincide con los directorios en el directorio actual.Para enumerar directorios solamente, me gusta esta función:
Ponlo en tu .bashrc.
Ejemplos de uso:
NOTA: se romperá si usa la
-i
opción. Aquí hay una solución para eso:fuente
Para su información, si desea imprimir todos los archivos en varias líneas, puede hacer uno
ls -1
que imprima cada archivo en una línea separada. archivo1 archivo2 archivo3fuente
Una lista simple del directorio actual, sería:
¿Lo quieres ordenado y limpio?
fuente
Prueba este. Funciona para todas las distribuciones de Linux.
fuente
ls -l | grep '^d' | awk '{print $9}'
One-liner para listar directorios solo desde "aquí".
Con recuento de archivos.
fuente
Paré parcialmente con:
Bueno, esto me reduce, la parte mayor :)
fuente
Agregando para completar el círculo, para recuperar la ruta de cada carpeta, use una combinación de la respuesta de Albert y Gordans que debería ser bastante útil.
Salida:
fuente
Usando Perl:
fuente
Esto es lo que uso para enumerar solo los nombres de directorio:
fuente
Para responder a la pregunta original,
*/
no tiene nada que ver conls
per se; se realiza mediante el shell / Bash, en un proceso conocido como globbing .Esta es la razón
echo */
y lals -d */
salida de los mismos elementos. (El-d
indicador hace que sels
muestren los nombres de directorio y no el contenido de los directorios).fuente
Aquí hay una variación usando el árbol que genera nombres de directorio solo en líneas separadas, sí, es feo pero bueno, funciona.
o con awk
Sin embargo, esto probablemente sea mejor y retendrá el
/
nombre del directorio posterior.fuente
O / P (en mi máquina) -
La salida anterior se puede refinar más usando corte.
fuente
El comando más corto de todos los tiempos (en realidad, un truco) para listar solo directorios. Escriba la ruta absoluta o la ruta relativa del directorio de interés y presione enter para ingresar al directorio de interés. Ahora escriba
cd
y presione la tecla Tab . Solo se muestran los directorios ahora.user@ubuntu:~/Desktop$cd <tab key>
El comando anterior ahora debería mostrar solo las carpetas en el escritorio . Más corto de hecho.
fuente