Hier ist ein nettes Bash-Skript zum Drucken eines Verzeichnisbaums mit den folgenden Farben: mama.indstate.edu/users/ice/bash/btree Einfach zu installieren, kein Root-Zugriff erforderlich.
aap
1
Die eigentliche Frage sollte lauten: Warum funktioniert das ls -dRnicht?
mastaBlasta
Die eigentliche Frage sollte eine Beschreibung von "Arbeit" enthalten, damit wir beantworten können, warum ls -dR"nicht funktioniert". ls -dRTatsächlich wird ausgeführt, was in der Dokumentation steht: "-d Verzeichnisse werden als reine Dateien aufgelistet (nicht rekursiv durchsucht)." ls -Rauf der anderen Seite tut rekursiv Liste Verzeichnisse.
LarsH
Antworten:
64
Angenommen, Sie möchten nur den Namen jedes Verzeichnisses:
+1. Übrigens ist das Argument '-print' optional - es ist voreingestellt. auch wenn ein bestimmtes auflistungsformat erforderlich ist, kann es in xargs eingespeist werden, um ls mit beliebigen optionen auszuführen, z find /path/ -type d -print0 | xargs -0 -r ls -ld. Beachten Sie den Ausdruck -print0 für eine NULL-terminierte Ausgabe und das passende Argument -0 xargs.
cas
Wenn Sie dies zufällig unter Windows und cygwin ausführen, verfügt Windows bereits über einen findBefehl. Geben Sie daher wahrscheinlich den Pfad zum bin-Ordner von cygwin an.
Phyatt
12
Ich habe in der Vergangenheit das Gleiche gesucht und folgendes gefunden:
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
Ich wollte eine, die auch Dateien auflistet und ich habe etwas über sed gelernt und folgendes geschrieben:
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/^/ |/"Ein Update zu tree.sh, das ich gemacht habe, um einige Randfälle zu behandeln, spätestens am: centerkey.com/tree
Dem Pilafian
9
Sie können das "tree" -Paket bekommen, auf ArchLinux und Ubuntu heißt es "tree"
Wenn Sie also in ~ / sind, können Sie tree -deine vollständige Verzeichnisliste (in einer Baumstruktur) für alle Inhalte von ~ / erstellen.
Ich benötige Klartext, eine durch neue Zeilen getrennte Auflistung von Unterverzeichnissen, während der Baum seine "Baum" -Struktur hinzuzufügen scheint. Und ich kann anscheinend keine Flagge finden, um sie zu deaktivieren.
Nemo
2
@ Capt.Nemo: Für eine einfache Auflistung verwenden Sie: tree -dfi ... Sie können hinzufügen --noreport, um die endgültige Anzeige der Gesamtzahl der Verzeichnisse zu unterdrücken .
Peter.O
3
Das OP legt nicht fest, welches Ausgabeformat gewünscht wird (jenseits der "einfachen Auflistung von Unterordnern").
Der letzte Schrägstrich / Liste nur Verzeichnisse.
Option globstaraktiviert **.
Option nullglobentfernt ein *, das mit nichts übereinstimmt.
Option dotglobzum Einschließen von Dateien, die mit einem Punkt beginnen (versteckte Dateien)
ls -dR
nicht?ls -dR
"nicht funktioniert".ls -dR
Tatsächlich wird ausgeführt, was in der Dokumentation steht: "-d Verzeichnisse werden als reine Dateien aufgelistet (nicht rekursiv durchsucht)."ls -R
auf der anderen Seite tut rekursiv Liste Verzeichnisse.Antworten:
Angenommen, Sie möchten nur den Namen jedes Verzeichnisses:
quelle
find /path/ -type d -print0 | xargs -0 -r ls -ld
. Beachten Sie den Ausdruck -print0 für eine NULL-terminierte Ausgabe und das passende Argument -0 xargs.find
Befehl. Geben Sie daher wahrscheinlich den Pfad zum bin-Ordner von cygwin an.Ich habe in der Vergangenheit das Gleiche gesucht und folgendes gefunden:
tree.sh
Ich wollte eine, die auch Dateien auflistet und ich habe etwas über sed gelernt und folgendes geschrieben:
fulltree.sh
quelle
ls -R | grep "^[.]/" | sed -e "s/:$//" -e "s/[^/]*[/]/--/g" -e "s/^/ |/"
Ein Update zu tree.sh, das ich gemacht habe, um einige Randfälle zu behandeln, spätestens am: centerkey.com/treeSie können das "tree" -Paket bekommen, auf ArchLinux und Ubuntu heißt es "tree"
Wenn Sie also in ~ / sind, können Sie
tree -d
eine vollständige Verzeichnisliste (in einer Baumstruktur) für alle Inhalte von ~ / erstellen.quelle
tree -dfi
... Sie können hinzufügen--noreport
, um die endgültige Anzeige der Gesamtzahl der Verzeichnisse zu unterdrücken .Das OP legt nicht fest, welches Ausgabeformat gewünscht wird (jenseits der "einfachen Auflistung von Unterordnern").
Entfernen Sie optional das Trailing
:
mit|sed -e 's/:$//'
oder formatieren Sie es mit|awk '{printf("%-92s \n",$0)}'
usw.quelle
Mit
zsh
und Glob Qualifiers :versteckte Verzeichnisse ausschließen:
quelle
Für die Bash:
Der letzte Schrägstrich / Liste nur Verzeichnisse.
Option
globstar
aktiviert**
.Option
nullglob
entfernt ein *, das mit nichts übereinstimmt.Option
dotglob
zum Einschließen von Dateien, die mit einem Punkt beginnen (versteckte Dateien)quelle