Berikut skrip bash yang bagus untuk mencetak pohon direktori, dengan warna: mama.indstate.edu/users/ice/bash/btree Mudah dipasang, tidak perlu akses root.
aap
1
Pertanyaan sebenarnya adalah: Mengapa ls -dRtidak berhasil?
mastaBlasta
Pertanyaan sebenarnya harus mencakup deskripsi "bekerja", sehingga kami dapat menjawab mengapa ls -dR"tidak bekerja". ls -dRsebenarnya melakukan apa yang dikatakan oleh dokumentasi: "-d Direktori terdaftar sebagai file biasa (tidak dicari secara rekursif)." ls -Rdi sisi lain tidak daftar subdirektori secara rekursif.
LarsH
Jawaban:
63
Dengan asumsi Anda hanya ingin nama setiap direktori:
+1. BTW, argumen '-print' bersifat opsional - standarnya. juga jika format daftar spesifik diperlukan, ia dapat dimasukkan ke dalam xargs untuk menjalankan ls dengan opsi yang diinginkan, misalnya find /path/ -type d -print0 | xargs -0 -r ls -ld. Perhatikan -print0 untuk keluaran yang diakhiri NULL, dan arg -0 xargs yang cocok.
cas
Dan jika Anda kebetulan menjalankan ini pada Windows dan cygwin, maka Windows sudah memiliki findperintah, jadi Anda mungkin harus menentukan path ke folder bin cygwin.
phyatt
11
Saya mencari hal yang sama di masa lalu dan menemukan ini:
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
Saya ingin satu yang mendaftarkan file juga dan saya belajar tentang sed dan menulis ini:
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/^/ |/"pembaruan ke tree.sh Saya membuat untuk menangani beberapa kasus tepi, terbaru di: centerkey.com/tree
Dem Pilafian
9
Anda bisa mendapatkan paket "tree", di ArchLinux dan Ubuntu disebut "tree"
Sehingga jika Anda berada di ~ /, Anda dapat melakukan tree -ddan mendapatkan daftar direktori lengkap (dalam struktur pohon) untuk semua yang ada di ~ /
Saya perlu teks biasa, baris baru yang memisahkan daftar sub-direktori, sementara tree sepertinya menambahkan struktur "tree" -nya. Dan sepertinya saya tidak dapat menemukan bendera untuk menonaktifkannya.
Nemo
2
@ Capt.Nemo: Untuk cantuman biasa, gunakan: tree -dfi ... Anda dapat menambah --noreportuntuk menekan tampilan akhir dari jumlah direktori total .
Peter.O
3
OP tidak menentukan format output apa yang mereka inginkan (di luar "daftar sub-folder").
Opsi globstardiaktifkan **.
Opsi nullglobmenghapus * yang tidak cocok dengan apa pun.
Opsi dotglobuntuk memasukkan file yang dimulai dengan titik (file tersembunyi)
ls -dR
tidak berhasil?ls -dR
"tidak bekerja".ls -dR
sebenarnya melakukan apa yang dikatakan oleh dokumentasi: "-d Direktori terdaftar sebagai file biasa (tidak dicari secara rekursif)."ls -R
di sisi lain tidak daftar subdirektori secara rekursif.Jawaban:
Dengan asumsi Anda hanya ingin nama setiap direktori:
sumber
find /path/ -type d -print0 | xargs -0 -r ls -ld
. Perhatikan -print0 untuk keluaran yang diakhiri NULL, dan arg -0 xargs yang cocok.find
perintah, jadi Anda mungkin harus menentukan path ke folder bin cygwin.Saya mencari hal yang sama di masa lalu dan menemukan ini:
tree.sh
Saya ingin satu yang mendaftarkan file juga dan saya belajar tentang sed dan menulis ini:
fulltree.sh
sumber
ls -R | grep "^[.]/" | sed -e "s/:$//" -e "s/[^/]*[/]/--/g" -e "s/^/ |/"
pembaruan ke tree.sh Saya membuat untuk menangani beberapa kasus tepi, terbaru di: centerkey.com/treeAnda bisa mendapatkan paket "tree", di ArchLinux dan Ubuntu disebut "tree"
Sehingga jika Anda berada di ~ /, Anda dapat melakukan
tree -d
dan mendapatkan daftar direktori lengkap (dalam struktur pohon) untuk semua yang ada di ~ /sumber
tree -dfi
... Anda dapat menambah--noreport
untuk menekan tampilan akhir dari jumlah direktori total .OP tidak menentukan format output apa yang mereka inginkan (di luar "daftar sub-folder").
Secara opsional hapus trailing
:
dengan|sed -e 's/:$//'
atau format dengan|awk '{printf("%-92s \n",$0)}'
dll.sumber
Dengan
zsh
dan kualifikasi global :untuk mengecualikan direktori tersembunyi:
sumber
Untuk bash:
Direktori slash / list hanya terakhir.
Opsi
globstar
diaktifkan**
.Opsi
nullglob
menghapus * yang tidak cocok dengan apa pun.Opsi
dotglob
untuk memasukkan file yang dimulai dengan titik (file tersembunyi)sumber