Oto ładny skrypt bash do wydrukowania drzewa katalogów, w kolorach: mama.indstate.edu/users/ice/bash/btree Łatwy w instalacji, nie wymaga dostępu do katalogu głównego.
aap
1
Prawdziwe pytanie powinno brzmieć: dlaczego ls -dRnie działa?
mastaBlasta
Prawdziwe pytanie powinno zawierać opis „pracy”, abyśmy mogli odpowiedzieć, dlaczego ls -dR„nie działa”. ls -dRfaktycznie robi to, co mówi dokumentacja: „-d Katalogi są wyświetlane jako zwykłe pliki (nie są przeszukiwane rekurencyjnie)”. ls -RZ drugiej strony robi lista podkatalogów rekurencyjnie.
LarsH
Odpowiedzi:
64
Zakładając, że chcesz tylko nazwę każdego katalogu:
+1. BTW, argument „-print” jest opcjonalny - jest domyślny. także jeśli wymagany jest określony format listowania, można go zasilić xargs, aby uruchomić ls z dowolnymi pożądanymi opcjami, np find /path/ -type d -print0 | xargs -0 -r ls -ld. Zwróć uwagę na -print0 dla wyjścia zakończonego wartością NULL i pasujący argument -0 xargs arg.
cas
A jeśli przypadkiem uruchamiasz to w systemie Windows i cygwin, to Windows ma już findpolecenie, więc prawdopodobnie powinieneś podać ścieżkę do folderu bin cygwina.
phyatt
12
W przeszłości szukałem tego samego i znalazłem to:
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
Chciałem taki, który również wyświetlał pliki, dowiedziałem się o sed i napisałem:
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/^/ |/"aktualizacja do tree.sh Zrobiłem, aby obsłużyć niektóre przypadki krawędzi, najpóźniej na: centerkey.com/tree
Dem Pilafian
9
Możesz dostać pakiet „drzewo”, zarówno w ArchLinux, jak i Ubuntu nazywa się „drzewo”
Więc jeśli jesteś w ~ /, możesz zrobić tree -di uzyskać pełną listę katalogów (w strukturze drzewa) dla wszystkich rzeczy w ~ /
Potrzebuję zwykłego tekstu, listy podkatalogów oddzielonej od siebie nową linią, podczas gdy drzewo wydaje się dodawać swoją strukturę „drzewa”. I nie mogę znaleźć flagi, aby ją wyłączyć.
Nemo
2
@ Capt.Nemo: Aby uzyskać zwykły wykaz, użyj: tree -dfi ... możesz dodać, --noreportaby ukryć końcowe wyświetlanie całkowitej liczby katalogów .
Peter.O
3
OP nie określa, jakiego formatu danych wyjściowych chcą (poza „zwykłą listą podfolderów”).
Opcja globstaraktywuje się **.
Opcja nullglobusuwa *, które nie pasują do niczego.
Opcja dotglobdołączania plików zaczynających się od kropki (pliki ukryte)
ls -dR
nie działa?ls -dR
„nie działa”.ls -dR
faktycznie robi to, co mówi dokumentacja: „-d Katalogi są wyświetlane jako zwykłe pliki (nie są przeszukiwane rekurencyjnie)”.ls -R
Z drugiej strony robi lista podkatalogów rekurencyjnie.Odpowiedzi:
Zakładając, że chcesz tylko nazwę każdego katalogu:
źródło
find /path/ -type d -print0 | xargs -0 -r ls -ld
. Zwróć uwagę na -print0 dla wyjścia zakończonego wartością NULL i pasujący argument -0 xargs arg.find
polecenie, więc prawdopodobnie powinieneś podać ścieżkę do folderu bin cygwina.W przeszłości szukałem tego samego i znalazłem to:
tree.sh
Chciałem taki, który również wyświetlał pliki, dowiedziałem się o sed i napisałem:
fulltree.sh
źródło
ls -R | grep "^[.]/" | sed -e "s/:$//" -e "s/[^/]*[/]/--/g" -e "s/^/ |/"
aktualizacja do tree.sh Zrobiłem, aby obsłużyć niektóre przypadki krawędzi, najpóźniej na: centerkey.com/treeMożesz dostać pakiet „drzewo”, zarówno w ArchLinux, jak i Ubuntu nazywa się „drzewo”
Więc jeśli jesteś w ~ /, możesz zrobić
tree -d
i uzyskać pełną listę katalogów (w strukturze drzewa) dla wszystkich rzeczy w ~ /źródło
tree -dfi
... możesz dodać,--noreport
aby ukryć końcowe wyświetlanie całkowitej liczby katalogów .OP nie określa, jakiego formatu danych wyjściowych chcą (poza „zwykłą listą podfolderów”).
Ewentualnie usunąć krawędzie tylną
:
z|sed -e 's/:$//'
lub sformatować go|awk '{printf("%-92s \n",$0)}'
itd.źródło
Z kwalifikatorami glob
zsh
i :aby wykluczyć ukryte katalogi:
źródło
Dla bash:
Ostatni katalog z ukośnikiem / listą.
Opcja
globstar
aktywuje się**
.Opcja
nullglob
usuwa *, które nie pasują do niczego.Opcja
dotglob
dołączania plików zaczynających się od kropki (pliki ukryte)źródło