Comment lister les sous-répertoires de manière récursive?

48

L'évident

ls -dR

ne marche pas.

J'utilise actuellement

find /path/ -type d -ls

mais la sortie n'est pas ce dont j'ai besoin (liste simple des sous-dossiers)

y a t-il une sortie?

Nemo
la source
Voici un joli script bash pour imprimer une arborescence de répertoires, avec les couleurs suivantes: mama.indstate.edu/users/ice/bash/btree Facile à installer, aucun accès root nécessaire.
aap
1
La vraie question devrait être: pourquoi ne ls -dRfonctionne pas?
mastaBlasta
La vraie question devrait inclure une description du "travail", afin que nous puissions dire pourquoi ls -dR"ne fonctionne pas". ls -dRfait ce que dit la documentation: "-d Les répertoires sont listés sous forme de fichiers simples (sans recherche récursive)." ls -Rd'autre part le fait des sous - répertoires de liste récursive.
LarsH

Réponses:

64

En supposant que vous vouliez juste le nom de chaque répertoire:

find /path/ -type d -print
psusi
la source
9
+1 BTW, l'argument '-print' est optionnel - par défaut. de plus, si un format de liste spécifique est requis, il peut être introduit dans xargs pour exécuter ls avec les options souhaitées, par exemple find /path/ -type d -print0 | xargs -0 -r ls -ld. Notez la sortie terminée par -print0 pour NULL et l'argument -0 xargs correspondant.
cas
Et si, par hasard, vous exécutez cette opération sous Windows et cygwin, Windows dispose déjà d'une findcommande. Vous devez donc probablement spécifier le chemin d'accès au dossier bin de cygwin.
Phyatt
12

Je cherchais la même chose dans le passé et j'ai trouvé ceci:

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

Je voulais un fichier qui listait également des fichiers et j'ai appris à propos de sed et écrit ceci:

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
Corbin Tarrant
la source
ls -R | grep "^[.]/" | sed -e "s/:$//" -e "s/[^/]*[/]/--/g" -e "s/^/ |/"une mise à jour de tree.sh que j'ai faite pour gérer certains cas, au plus tard à: centerkey.com/tree
Dem Pilafian
9

Vous pouvez obtenir le paquet "tree", à la fois sur ArchLinux et Ubuntu, il est appelé "tree"

Ainsi, si vous êtes dans ~ /, vous pouvez faire tree -det obtenir une liste complète du répertoire (dans une arborescence) pour tout ce qui se trouve dans ~ /

Odaym
la source
J'ai besoin de texte en clair, d'une liste de sous-répertoires séparés par une nouvelle ligne, tandis que tree semble ajouter sa structure "tree". Et je n'arrive pas à trouver un drapeau pour le désactiver.
Nemo
2
@ Capt.Nemo: Pour une liste simple, utilisez: tree -dfi ... vous pouvez ajouter --noreportpour supprimer l'affichage final du nombre total de répertoires .
Peter.O
3

Les OP ne spécifient pas le format de sortie souhaité (au-delà de "la liste complète des sous-dossiers").

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

Supprimez éventuellement la fin :avec |sed -e 's/:$//'ou formatez-la avec |awk '{printf("%-92s \n",$0)}'etc.

Dianevm
la source
1

Qualificateurs With zshet glob :

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

pour exclure les répertoires cachés:

print -rl /path/**/*(/)
don_crissti
la source
0

Pour bash:

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

La dernière barre oblique / liste seulement les répertoires.

L'option globstars'active **.
Option nullglobsupprime un * qui ne correspond à rien.
Option dotglobpour inclure des fichiers commençant par un point (fichiers cachés)


la source