Commande Linux pour imprimer la structure du répertoire sous la forme d'une arborescence

510

Existe-t-il une commande Linux que je peux appeler à partir d'un script Bash qui imprimera la structure du répertoire sous la forme d'une arborescence, par exemple,

folder1
   a.txt
   b.txt
folder2
   folder3
user243655
la source
7
Courez find. Ou find . -not -path '*/\.*'pour masquer les fichiers et dossiers commençant par .. Si vous voulez avoir une sortie avec des espaces, comme dans la question, utilisez-la avec ce script "find prettifier":find . -not -path '*/\.*' | python -c "import sys as s;s.a=[];[setattr(s,'a',list(filter(lambda p: c.startswith(p+'/'),s.a)))or (s.stdout.write(' '*len(s.a)+c[len(s.a[-1])+1 if s.a else 0:])or True) and s.a.append(c[:-1]) for c in s.stdin]"
utilisateur
11
Ces questions ne devraient-elles pas être migrées vers SuperUser plutôt que fermées?
Balmipour du
12
je ne pense pas que cette question mérite d'être fermée comme "hors sujet". Les balises semblent avoir raison.
Sanket Berde
14
La politique de fermeture des questions sans migration nuit à la fois au stackoverflow et aux connaissances humaines en général. Au cours des 3 derniers jours, toutes les questions que j'ai trouvées sur Google et que j'ai rencontrées ont été fermées pour un raisonnement similaire, et aucune activité n'a pu se produire. Cela signifie que personne ne peut le mettre à jour, personne ne peut donner une meilleure réponse, et cela donne à stackoverflow un aspect myope ou élitiste. Stackoverflow devrait envisager d'exiger une migration lorsqu'un sujet présente ces conditions.
Nay
5
Je suis d'accord avec @NickYeates Je suis ici fin septembre 2017 et je trouve toujours des réponses à cette même question. Pensez à long terme lorsque nous concevons ces politiques de questions et réponses!
Alex

Réponses:

774

Est-ce ce que vous cherchez un arbre ? Il devrait figurer dans la plupart des distributions (peut-être en tant qu'installation facultative).

~> tree -d /proc/self/
/proc/self/
|-- attr
|-- cwd -> /proc
|-- fd
|   `-- 3 -> /proc/15589/fd
|-- fdinfo
|-- net
|   |-- dev_snmp6
|   |-- netfilter
|   |-- rpc
|   |   |-- auth.rpcsec.context
|   |   |-- auth.rpcsec.init
|   |   |-- auth.unix.gid
|   |   |-- auth.unix.ip
|   |   |-- nfs4.idtoname
|   |   |-- nfs4.nametoid
|   |   |-- nfsd.export
|   |   `-- nfsd.fh
|   `-- stat
|-- root -> /
`-- task
    `-- 15589
        |-- attr
        |-- cwd -> /proc
        |-- fd
        | `-- 3 -> /proc/15589/task/15589/fd
        |-- fdinfo
        `-- root -> /

27 directories

échantillon extrait de la page Web du responsable.

Vous pouvez ajouter l'option -L ##est remplacé par un nombre, pour spécifier la profondeur de récursivité maximale.

Supprimer -dpour afficher également les fichiers.

rusé
la source
54
Remarque pour tout visiteur voyant ceci: supprimer -dpour afficher également les fichiers!
Afr
29
Remarque pour tout visiteur voyant ceci: La page de manuel répertorie un camion de plus de drapeaux pour vous :)
oivvio
43
Pour installer sur Mac OS X avec Homebrew: brew install tree
funfuntime
2
Pour installer sur cygwin apt-cyg install tree(en supposant que vous avez installé apt-cyg)
blockloop
2
Même Ubuntu 16.04 n'est pas livré avec cela. Utilisez apt-get install treel'installera.
Romeo Sierra
331

Vous pouvez utiliser celui-ci:

ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'

Il montrera une représentation graphique des sous-répertoires actuels sans fichiers en quelques secondes , par exemple dans /var/cache/:

   .
   |-apache2
   |---mod_cache_disk
   |-apparmor
   |-apt
   |---archives
   |-----partial
   |-apt-xapian-index
   |---index.1
   |-dbconfig-common
   |---backups
   |-debconf

La source

Soufiane Hassou
la source
7
Si vous le voulez avec des espaces, plus comme l'OP demandé, alors ceci: ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g' -e 's/^/ /'
Ben
de quelque façon que je puisse faire ignorer les fichiers dot? Par exemple, l'empêcher de lister le contenu de .git?
GMA
@GeorgeMillo voir mon commentaire
utilisateur
32
N'imprime pas de fichiers.
Tomáš Zato - Reinstate Monica
36
avec fichiers: find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
JavaSheriff
18

Pour ajouter la solution de Hassou à votre .bashrc, essayez:

alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/   /'"'"' -e '"'"'s/-/|/'"'"
RussellStewart
la source
6
Méfiez-vous du caractère de nouvelle ligne à la fin de la première ligne si vous copiez cela directement
Rahul
2
Joli alias. Mais il manque '' (2 caractères de guillemet simple) à la fin. Cela fonctionne même sans, mais ... si vous voulez ajouter quelques commandes à la fin, vous verrez que le littéral n'est pas complet. Donc ça devrait aller alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"''
Hero Qu
7

Cette commande fonctionne pour afficher les dossiers et les fichiers .

find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"

Exemple de sortie:

.
 |-trace.pcap
 |-parent
 | |-chdir1
 | | |-file1.txt
 | |-chdir2
 | | |-file2.txt
 | | |-file3.sh
 |-tmp
 | |-json-c-0.11-4.el7_0.x86_64.rpm

Source: Commentaire de @javasheriff ici . Son submergé en tant que commentaire et le poster comme réponse aide les utilisateurs à le repérer facilement.

Pavan Kumar
la source
pour python3 j'ai trouvé que ça find . |grep -vE 'pyc|swp|__init' | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"fonctionnait bien
patroqueeet
3

J'améliore la sortie de la réponse de @ Hassou avec:

ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//──/g' -e 's/─/├/' -e '$s/├/└/'

Cela ressemble beaucoup à la sortie de treemaintenant:

.
├─pkcs11
├─pki
├───ca-trust
├─────extracted
├───────java
├───────openssl
├───────pem
├─────source
├───────anchors
├─profile.d
└─ssh

Vous pouvez également en créer un alias:

alias ltree=$'ls -R | grep ":$" | sed -e \'s/:$//\' -e \'s/[^-][^\/]*\//──/g\' -e \'s/─/├/\' -e \'$s/├/└/\''

BTW, treen'est pas disponible dans certains environnements, comme MinGW. Le suppléant est donc utile.

Robert
la source
gitbash sur windows n'aime pas la dernière expression, elle dit qu'elle n'est pas terminée
Leos Literak
3

Vous pouvez également utiliser la combinaison des commandes find et awk pour imprimer l'arborescence des répertoires. Pour plus de détails, reportez-vous à " Comment imprimer une structure de répertoires arborescents à plusieurs niveaux à l'aide des commandes combinées linux find et awk "

find . -type d | awk -F'/' '{ 
depth=3;
offset=2;
str="|  ";
path="";
if(NF >= 2 && NF < depth + offset) {
    while(offset < NF) {
        path = path "|  ";
        offset ++;
    }
    print path "|-- "$NF;
}}'
ylspirit
la source