ฉันจะแสดงรายการไดเรกทอรีย่อยซ้ำ?


47

อย่างชัดเจน

ls -dR

ไม่สำเร็จ.

ฉันกำลังใช้

find /path/ -type d -ls

แต่ผลลัพธ์ไม่ใช่สิ่งที่ฉันต้องการ (รายการธรรมดาของโฟลเดอร์ย่อย)

มีทางออกไหม?


นี่เป็นสคริปต์ทุบตีที่ดีในการพิมพ์แผนผังไดเรกทอรีด้วยสี: mama.indstate.edu/users/ice/bash/btreeติดตั้งง่ายไม่ต้องใช้การเข้าถึงรูท
aap

1
คำถามจริงควรเป็น: ทำไมls -dRไม่ทำงาน
mastaBlasta

คำถามจริงควรมีคำอธิบายของ "งาน" เพื่อที่เราจะได้ตอบว่าทำไมls -dR"ไม่ทำงาน" ls -dRจริง ๆ แล้วสิ่งที่เอกสารประกอบพูดว่า: "-d ไดเรกทอรีถูกแสดงรายการเป็นไฟล์ธรรมดา (ไม่ค้นหาซ้ำ)" ls -Rบนมืออื่น ๆไม่ไดเรกทอรีรายชื่อซ้ำ
LarsH

คำตอบ:


63

สมมติว่าคุณต้องการชื่อของแต่ละไดเรกทอรี:

find /path/ -type d -print

9
+1 BTW, '-print' arg เป็นตัวเลือก - เป็นค่าเริ่มต้น ถ้ารูปแบบรายการที่เฉพาะเจาะจงเป็นสิ่งจำเป็นที่จะสามารถป้อนเข้า xargs เพื่อเรียกใช้คำสั่ง ls กับตัวเลือกใด ๆ find /path/ -type d -print0 | xargs -0 -r ls -ldที่ต้องการเช่น หมายเหตุ -print0 สำหรับเอาท์พุทสิ้นสุด NULL และการจับคู่ -0 xargs หาเรื่อง
cas

และถ้าคุณบังเอิญใช้งานบน Windows และ cygwin แสดงว่า Windows มีfindคำสั่งอยู่แล้วดังนั้นคุณควรระบุพา ธ ไปยังโฟลเดอร์ bin ของ cygwin
phyatt

12

ฉันกำลังมองหาสิ่งเดียวกันในอดีตและพบสิ่งนี้:

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

ฉันต้องการไฟล์ที่ระบุไว้เช่นกันและฉันเรียนรู้เกี่ยวกับ sed และเขียนสิ่งนี้:

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/^/ |/"อัปเดตเป็นtree.shฉันจัดการกรณีขอบบางอย่างล่าสุดได้ที่: centerkey.com/tree
Dem Pilafian

9

คุณสามารถรับแพ็คเกจ "tree" ได้ทั้ง ArchLinux และ Ubuntu เรียกว่า "tree"

ดังนั้นหากคุณอยู่ใน ~ / คุณสามารถทำได้tree -dและรับรายชื่อไดเรกทอรีแบบเต็ม (ในโครงสร้างแบบต้นไม้) สำหรับสิ่งที่อยู่ใน ~ /


ฉันต้องการข้อความธรรมดาบรรทัดใหม่คั่นรายการของไดเรกทอรีย่อยในขณะที่ต้นไม้ดูเหมือนว่าจะเพิ่มโครงสร้าง "ต้นไม้" ของมัน และฉันไม่สามารถหาค่าสถานะเพื่อปิดใช้งานมันได้
Nemo

2
@ Capt.Nemo: สำหรับรายชื่อธรรมดาใช้: tree -dfi ... คุณสามารถเพิ่ม--noreportการปราบปรามการแสดงผลสุดท้ายของการนับไดเรกทอรีทั้งหมด
Peter.O

3

OP ไม่ได้ระบุรูปแบบของเอาต์พุตที่ต้องการ (นอกเหนือจาก "รายการธรรมดาของโฟลเดอร์ย่อย")

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

เลือกลบส่วนท้าย:ด้วย|sed -e 's/:$//'หรือจัดรูปแบบด้วย|awk '{printf("%-92s \n",$0)}'เป็นต้น



0

สำหรับทุบตี:

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

เครื่องหมายทับ / รายการสุดท้ายไดเรกทอรีเท่านั้น

ตัวเลือกที่เปิดใช้งานglobstar ตัวเลือกจะลบ * ที่ไม่ตรงกับสิ่งใดเลย ตัวเลือกในการรวมไฟล์ที่ขึ้นต้นด้วยจุด (ไฟล์ที่ซ่อน)**
nullglob
dotglob

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.