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:
+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
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").
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)
ls -dR
no funciona?ls -dR
"no funciona".ls -dR
en realidad hace lo que dice la documentación: "-d Los directorios se enumeran como archivos sin formato (no se buscan de forma recursiva)".ls -R
por otro lado , enumera subdirectorios de forma recursiva.Respuestas:
Suponiendo que solo desea el nombre de cada directorio:
fuente
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.find
comando, por lo que probablemente debería especificar la ruta a la carpeta bin de cygwin.Estaba buscando lo mismo en el pasado y encontré esto:
tree.sh
Quería uno que también enumerara archivos y aprendí sobre sed y escribí esto:
fulltree.sh
fuente
ls -R | grep "^[.]/" | sed -e "s/:$//" -e "s/[^/]*[/]/--/g" -e "s/^/ |/"
una actualización de tree.sh que realicé para manejar algunos casos extremosPuede obtener el paquete "árbol", tanto en ArchLinux como en Ubuntu se llama "árbol"
De modo que si está en ~ /, puede hacer
tree -d
y obtener una lista completa del directorio (en una estructura de árbol) para todo lo que hay en ~ /fuente
tree -dfi
... puede agregar--noreport
para suprimir la visualización final del recuento total de directorios .El OP no especifica qué formato de salida desean (más allá de la "lista simple de subcarpetas").
Opcionalmente elimine el final
:
con|sed -e 's/:$//'
o formatee con|awk '{printf("%-92s \n",$0)}'
etc.fuente
Con
zsh
y calificadores glob :para excluir directorios ocultos:
fuente
Para bash:
Los últimos directorios de barra inclinada / lista solamente.
La opción se
globstar
activa**
.La opción
nullglob
elimina un * que no coincide con nada.Opción
dotglob
para incluir archivos que comienzan con un punto (archivos ocultos)fuente