¿Cómo puedo enumerar subdirectorios de forma recursiva?

48

Lo obvio

ls -dR

No funciona.

Actualmente estoy usando

find /path/ -type d -ls

pero el resultado no es lo que necesito (lista simple de subcarpetas)

¿Hay una salida?

Nemo
fuente
Aquí hay un buen script de bash para imprimir un árbol de directorios, con colores: mama.indstate.edu/users/ice/bash/btree Fácil de instalar, no se necesita acceso a la raíz.
aap
1
La verdadera pregunta debería ser: ¿Por qué ls -dRno funciona?
mastaBlasta
La verdadera pregunta debe incluir una descripción de "trabajo", para que podamos responder por qué ls -dR"no funciona". ls -dRen realidad hace lo que dice la documentación: "-d Los directorios se enumeran como archivos sin formato (no se buscan de forma recursiva)". ls -Rpor otro lado , enumera subdirectorios de forma recursiva.
LarsH

Respuestas:

64

Suponiendo que solo desea el nombre de cada directorio:

find /path/ -type d -print
psusi
fuente
99
+1. Por cierto, el argumento '-print' es opcional, es el predeterminado. Además, si se requiere un formato de listado específico, se puede alimentar a xargs para ejecutar ls con las opciones deseadas, por ejemplo find /path/ -type d -print0 | xargs -0 -r ls -ld. Tenga en cuenta la -print0 para salida terminada en NULL, y la coincidencia -0 xargs arg.
cas
Y si por casualidad está ejecutando esto en Windows y cygwin, Windows ya tiene un findcomando, por lo que probablemente debería especificar la ruta a la carpeta bin de cygwin.
phyatt
12

Estaba buscando lo mismo en el pasado y encontré esto:

tree.sh

#!/bin/sh
#######################################################
#  UNIX TREE                                                            
#  Version: 2.3                                       
#  File: ~/apps/tree/tree.sh                          
#                                                     
#  Displays Structure of Directory Hierarchy          
#  -------------------------------------------------  
#  This tiny script uses "ls", "grep", and "sed"      
#  in a single command to show the nesting of         
#  sub-directories.  The setup command for PATH       
#  works with the Bash shell (the Mac OS X default).  
#                                                     
#  Setup:                                             
#     $ cd ~/apps/tree                                
#     $ chmod u+x tree.sh                             
#     $ ln -s ~/apps/tree/tree.sh ~/bin/tree          
#     $ echo "PATH=~/bin:\${PATH}" >> ~/.profile      
#                                                     
#  Usage:                                             
#     $ tree [directory]                              
#                                                     
#  Examples:                                          
#     $ tree                                          
#     $ tree /etc/opt                                 
#     $ tree ..                                       
#                                                     
#  Public Domain Software -- Free to Use as You Like  
#  http://www.centerkey.com/tree  -  By Dem Pilafian  
#######################################################

echo
if [ "$1" != "" ]  #if parameter exists, use as base folder
   then cd "$1"
   fi
pwd
ls -R | grep ":$" |   \
   sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'
# 1st sed: remove colons
# 2nd sed: replace higher level folder names with dashes
# 3rd sed: indent graph three spaces
# 4th sed: replace first dash with a vertical bar
if [ `ls -F -1 | grep "/" | wc -l` = 0 ]   # check if no folders
   then echo "   -> no sub-directories"
   fi
echo
exit

Quería uno que también enumerara archivos y aprendí sobre sed y escribí esto:

fulltree.sh

#!/bin/sh
#############################################
# Script that displays a recursive formatted folder and file listing
# @author Corbin
# @site iamcorbin.net
#Folder Seperator
BREAK='-------------------------------------------------------------------------------------'

#Optional: if a folder is passed as an argument, run fulltree on that folder rather than the current folder
if [ "$1" != "" ]
   then cd "$1"
   fi
pwd

## Recursive Directory Listing with files
 # 1- preserve directories from being removed in 2 & 3
 # 2- strip first 4 columns
 # 3- strip size and date
 # 4- prepend '  -- ' on each line
 # 5- remove '  -- ' from directories
 # 6- remove extra lines
 # 7- Insert a line break after directories
 # 8- Put a | at the beginning of all lines
 # 9- Indent and process 1st level sub dirs
 #10- Indent and process 2nd level sub dirs
ls -Rhl | sed \
    -e 's/^\.\//x x x x 00:00 |-/' \
    -e 's/^\([^\ ]*.\)\{4\}//' \
    -e 's/.*[0-9]\{2\}:[0-9]\{2\}//' \
    -e 's/^/  -- /' \
    -e 's/\ \ --\ \ |-//'  \
    -e '/--\ $/ d' \
    -e '/^[^ ]/ i\'$BREAK \
    -e 's/^/| /' \
| sed -e '/[^/]*\//,/'$BREAK'/ s/^|/\t&/' -e '/^\t/,/'$BREAK'/ s/'$BREAK'/\t&/' -e 's/[^/]*\//\t\| /' \
| sed -e '/[^/]*\//,/'$BREAK'/ s/^\t|/\t&/' -e '/^\t\t/,/'$BREAK'/  s/'$BREAK'/\t&/' -e 's/[^/]*\//\t\t\| /' \
| sed -e '/[^/]*\//,/'$BREAK'/ s/^\t\t/\t&/' -e 's/[^/]*\//\t\t\t\| /'
echo $BREAK
Tarrant Corbin
fuente
ls -R | grep "^[.]/" | sed -e "s/:$//" -e "s/[^/]*[/]/--/g" -e "s/^/ |/"una actualización de tree.sh que realicé para manejar algunos casos extremos
Dem Pilafian
9

Puede obtener el paquete "árbol", tanto en ArchLinux como en Ubuntu se llama "árbol"

De modo que si está en ~ /, puede hacer tree -dy obtener una lista completa del directorio (en una estructura de árbol) para todo lo que hay en ~ /

Odaym
fuente
Necesito texto sin formato, una nueva lista de subdirectorios separada por líneas, mientras que el árbol parece agregar su estructura de "árbol". Y parece que no puedo encontrar una bandera para deshabilitarla.
Nemo
2
@ Capt.Nemo: para una lista simple, use: tree -dfi ... puede agregar --noreportpara suprimir la visualización final del recuento total de directorios .
Peter
3

El OP no especifica qué formato de salida desean (más allá de la "lista simple de subcarpetas").

[ 15:53. root@prod-2 /var]% ls -lDR | grep ':$' | head
 .:
 ./account:
 ./cache:
 ./cache/coolkey:
 ./cache/fontconfig:
 ./cache/logwatch:
 ./cache/man:
 ./cache/man/X11R6:
 ./cache/man/X11R6/cat1:
 ./cache/man/X11R6/cat2:...

Opcionalmente elimine el final :con |sed -e 's/:$//'o formatee con |awk '{printf("%-92s \n",$0)}'etc.

dianevm
fuente
1

Con zshy calificadores glob :

print -rl /path/**/*(D/)

para excluir directorios ocultos:

print -rl /path/**/*(/)
don_crissti
fuente
0

Para bash:

shopt -s globstar nullglob dotglob
echo /path/**/*/

Los últimos directorios de barra inclinada / lista solamente.

La opción se globstaractiva **.
La opción nullglobelimina un * que no coincide con nada.
Opción dotglobpara incluir archivos que comienzan con un punto (archivos ocultos)


fuente