Bagaimana saya bisa mendaftar subdirektori secara rekursif?


47

Yang jelas

ls -dR

tidak bekerja.

Saya sedang menggunakan

find /path/ -type d -ls

tetapi hasilnya bukan yang saya butuhkan (daftar sederhana dari sub-folder)

Apakah ada jalan keluar?


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:

find /path/ -type d -print

9
+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").

[ 15:53. root@prod-2 /var]% ls -lDR | grep ':$' | head
 .:
 ./account:
 ./cache:
 ./cache/coolkey:
 ./cache/fontconfig:
 ./cache/logwatch:
 ./cache/man:
 ./cache/man/X11R6:
 ./cache/man/X11R6/cat1:
 ./cache/man/X11R6/cat2:...

Secara opsional hapus trailing :dengan |sed -e 's/:$//'atau format dengan |awk '{printf("%-92s \n",$0)}'dll.



0

Untuk bash:

shopt -s globstar nullglob dotglob
echo /path/**/*/

Direktori slash / list hanya terakhir.

Opsi globstardiaktifkan **.
Opsi nullglobmenghapus * yang tidak cocok dengan apa pun.
Opsi dotglobuntuk memasukkan file yang dimulai dengan titik (file tersembunyi)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.