मैं उप-श्रेणियों को पुनरावर्ती रूप से कैसे सूचीबद्ध कर सकता हूं?


48

स्पष्ट

ls -dR

काम नहीं करता।

मैं वर्तमान में उपयोग कर रहा हूं

find /path/ -type d -ls

लेकिन आउटपुट वह नहीं है जिसकी मुझे आवश्यकता है (उप-फ़ोल्डरों की सादे लिस्टिंग)

क्या और कोई रास्ता है?


यहां निर्देशिका ट्री को प्रिंट करने के लिए रंगों के साथ एक अच्छी बैश स्क्रिप्ट दी गई है: mama.indstate.edu/users/ice/bash/btree स्थापित करने के लिए आसान, कोई रूट एक्सेस की आवश्यकता नहीं है।
आफ

1
असली सवाल यह होना चाहिए: ls -dRकाम क्यों नहीं करता है?
मस्ताबेला

असली सवाल में "काम" का विवरण शामिल होना चाहिए, ताकि हम जवाब दे सकें कि "काम क्यों ls -dRनहीं करता है"। ls -dRवास्तव में प्रलेखन क्या कहता है: "-d निर्देशिकाएँ को सादे फ़ाइलों के रूप में सूचीबद्ध किया गया है (पुनरावर्ती रूप से नहीं खोजा गया)।" ls -Rदूसरी ओर उप-श्रेणियों को पुनरावर्ती रूप से सूचीबद्ध करता है
लार्स

जवाबों:


64

मान लें कि आप प्रत्येक निर्देशिका का नाम चाहते हैं:

find /path/ -type d -print

9
+1। BTW, '-प्रिंट' arg वैकल्पिक है - यह डिफ़ॉल्ट है। यह भी कि यदि विशिष्ट सूची प्रारूप की आवश्यकता है, तो इसे किसी भी वांछित विकल्प जैसे ls को चलाने के लिए xargs में फीड किया जा सकता है find /path/ -type d -print0 | xargs -0 -r ls -ld। NULL टर्मिनेटेड आउटपुट के लिए -प्रिंट0 नोट करें, और मैचिंग -0 xargs arg।
कैस

और यदि आप संयोग से इसे विंडोज और साइबरविन पर चला रहे हैं, तो विंडोज में पहले से ही एक findकमांड है, इसलिए आपको शायद साइबरविन के बिन फ़ोल्डर के लिए पथ निर्दिष्ट करना चाहिए।
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/^/ |/"पेड़ के लिए एक अद्यतन। मैं कुछ किनारे के मामलों को संभालने के लिए बना था, नवीनतम पर: centerkey.com/tree
Dem Pilafian

9

आप "ट्री" पैकेज प्राप्त कर सकते हैं, दोनों आर्कलिंक्स और उबंटू पर इसे "ट्री" कहा जाता है

ताकि यदि आप ~ / में हैं, तो आप क्या कर सकते हैं tree -dऔर एक पूर्ण निर्देशिका सूची (एक पेड़ की संरचना में) प्राप्त कर सकते हैं कि क्या है ~ /


मुझे सादे पाठ की आवश्यकता है, उप-निर्देशिकाओं की नई लाइन अलग-अलग लिस्टिंग, जबकि पेड़ अपनी "पेड़" संरचना को जोड़ने के लिए लगता है। और मैं इसे अक्षम करने के लिए एक झंडा नहीं ढूंढ सकता।
निमो

2
@ Capt.Nemo: एक सादे लिस्टिंग के लिए, का उपयोग करें: tree -dfi ... आप कुल निर्देशिका गणना--noreport के अंतिम प्रदर्शन को दबाने के लिए जोड़ सकते हैं ।
पीटर।

3

ओपी निर्दिष्ट नहीं करता है कि आउटपुट का प्रारूप क्या है जो वे चाहते हैं ("उप-फ़ोल्डरों की सादे लिस्टिंग से परे")।

[ 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जिसमें डॉट के साथ शुरू होने वाली फाइलें शामिल हैं (छिपी हुई फाइलें)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.