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:
+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
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 ~ /
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").
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)
ls -dR
fonctionne pas?ls -dR
"ne fonctionne pas".ls -dR
fait ce que dit la documentation: "-d Les répertoires sont listés sous forme de fichiers simples (sans recherche récursive)."ls -R
d'autre part le fait des sous - répertoires de liste récursive.Réponses:
En supposant que vous vouliez juste le nom de chaque répertoire:
la source
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.find
commande. Vous devez donc probablement spécifier le chemin d'accès au dossier bin de cygwin.Je cherchais la même chose dans le passé et j'ai trouvé ceci:
tree.sh
Je voulais un fichier qui listait également des fichiers et j'ai appris à propos de sed et écrit ceci:
fulltree.sh
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/treeVous pouvez obtenir le paquet "tree", à la fois sur ArchLinux et Ubuntu, il est appelé "tree"
Ainsi, si vous êtes dans ~ /, vous pouvez faire
tree -d
et obtenir une liste complète du répertoire (dans une arborescence) pour tout ce qui se trouve dans ~ /la source
tree -dfi
... vous pouvez ajouter--noreport
pour supprimer l'affichage final du nombre total de répertoires .Les OP ne spécifient pas le format de sortie souhaité (au-delà de "la liste complète des sous-dossiers").
Supprimez éventuellement la fin
:
avec|sed -e 's/:$//'
ou formatez-la avec|awk '{printf("%-92s \n",$0)}'
etc.la source
Qualificateurs With
zsh
et glob :pour exclure les répertoires cachés:
la source
Pour bash:
La dernière barre oblique / liste seulement les répertoires.
L'option
globstar
s'active**
.Option
nullglob
supprime un * qui ne correspond à rien.Option
dotglob
pour inclure des fichiers commençant par un point (fichiers cachés)la source