Làm thế nào tôi có thể liệt kê các thư mục con theo cách đệ quy?


48

Rõ ràng

ls -dR

không hoạt động.

Tôi hiện đang sử dụng

find /path/ -type d -ls

nhưng đầu ra không phải là thứ tôi cần (danh sách đơn giản các thư mục con)

đó có phải là lối ra?


Đây là một tập lệnh bash đẹp để in cây thư mục, với các màu: mama.indstate.edu/users/ice/bash/btree Dễ dàng cài đặt, không cần quyền truy cập root.
aap

1
Câu hỏi thực sự nên là: Tại sao ls -dRkhông hoạt động?
mastaBlasta

Câu hỏi thực sự nên bao gồm một mô tả về "công việc", để chúng ta có thể trả lời tại sao ls -dR"không hoạt động". ls -dRthực sự làm những gì tài liệu nói: "-d Directories được liệt kê dưới dạng tệp đơn giản (không được tìm kiếm đệ quy)." ls -Rmặt khác không liệt kê các thư mục con theo cách đệ quy.
LarsH

Câu trả lời:


64

Giả sử bạn chỉ muốn tên của mỗi thư mục:

find /path/ -type d -print

9
+1. BTW, đối số '-print' là tùy chọn - mặc định. ngoài ra nếu một định dạng danh sách cụ thể được yêu cầu, nó có thể được đưa vào xargs để chạy ls với bất kỳ tùy chọn mong muốn nào, vd find /path/ -type d -print0 | xargs -0 -r ls -ld. Lưu ý -print0 cho đầu ra kết thúc NULL và đối số -0 xargs phù hợp.
cas

Và nếu bạn tình cờ đang chạy cái này trên Windows và cygwin, thì Windows đã có một findlệnh, vì vậy bạn có thể nên chỉ định đường dẫn đến thư mục bin của cygwin.
phyatt

12

Tôi đã tìm kiếm điều tương tự trong quá khứ và tìm thấy điều này:

cây.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

Tôi muốn một trong đó liệt kê các tập tin và tôi đã tìm hiểu về sed và đã viết điều này:

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/^/ |/"một bản cập nhật cho cây.sh Tôi đã thực hiện để xử lý một số trường hợp cạnh, mới nhất tại: centrekey.com/tree
Dem Pilafian

9

Bạn có thể nhận gói "cây", trên cả ArchLinux và Ubuntu, nó được gọi là "cây"

Vì vậy, nếu bạn đang ở ~ /, bạn có thể làm tree -dvà nhận danh sách thư mục đầy đủ (trong cấu trúc cây) cho tất cả những gì trong ~ /


Tôi cần văn bản đơn giản, dòng mới liệt kê danh sách các thư mục con, trong khi cây dường như thêm cấu trúc "cây" của nó. Và tôi dường như không thể tìm thấy một lá cờ để vô hiệu hóa nó.
Nemo

2
@ Capt.Nemo: Đối với danh sách đơn giản, hãy sử dụng: tree -dfi ... bạn có thể thêm --noreportđể chặn hiển thị cuối cùng của tổng số thư mục .
Peter.O

3

OP không chỉ định định dạng đầu ra mà họ muốn (ngoài "danh sách đơn giản các thư mục con").

[ 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:...

Tùy chọn loại bỏ dấu vết :với |sed -e 's/:$//'hoặc định dạng nó với |awk '{printf("%-92s \n",$0)}'vv



0

Đối với bash:

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

Các thư mục gạch chéo / danh sách cuối cùng.

Tùy chọn globstarkích hoạt **.
Tùy chọn nullglobloại bỏ một * không phù hợp với không có gì.
Tùy chọn dotglobđể bao gồm các tệp bắt đầu bằng dấu chấm (tệp ẩn)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.