Alt dizinleri tekrarlı olarak nasıl listeleyebilirim?


48

Bariz

ls -dR

çalışmıyor.

Şu anda kullanıyorum

find /path/ -type d -ls

ama çıktı ihtiyacım olan şey değil (alt klasörlerin basit listelenmesi)

Çıkış yolu var mı?


Dizin ağacı basmak için güzel bir bash betiği var, renkleri: mama.indstate.edu/users/ice/bash/btree Kurulumu kolay, root erişimi yok.
aap

1
Asıl soru şöyle olmalı: Neden çalışmıyor ls -dR?
mastaBlasta

Asıl soru, "iş" in bir tanımını içermeli, böylece neden ls -dR"çalışmadığını" cevaplayabilelim . ls -dRaslında belgelerin ne dediğini yapar: "-d Dizinler düz dosyalar olarak listelenir (tekrarlı olarak aranmaz)." ls -RÖte yandan , alt dizinleri yinelemeli olarak listeler.
LarsH

Yanıtlar:


64

Sadece her dizinin adını istediğinizi varsayalım:

find /path/ -type d -print

9
+1. BTW, '-print' argümanı isteğe bağlıdır - varsayılandır. ayrıca, belirli bir liste formatı gerekliyse, istenen herhangi bir seçenekle, örneğin çalıştırmak için xargs'a beslenebilir find /path/ -type d -print0 | xargs -0 -r ls -ld. NULL sonlandırılmış çıktı için -print0 ve eşleşen -0 xargs argümanına dikkat edin.
cas

Ve eğer şans eseri bunu Windows ve cygwin'de çalıştırıyorsanız, Windows'un zaten bir findkomutu vardır, bu nedenle muhtemelen cygwin'in bin klasörünün yolunu belirtmelisiniz.
phyatt

12

Geçmişte aynı şeyi arıyordum ve şunu buldum:

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

Dosyaları da listeleyen birini istedim ve sed hakkında öğrendim ve şunu yazdım:

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 'a yapılan güncelleme bazı kenar davaları ele aldım, en son: centerkey.com/tree
Dem Pilafian

9

"Ağaç" paketini alabilirsiniz, hem ArchLinux hem de Ubuntu'da "ağaç" olarak adlandırılır

Böylece ~ / isindeyseniz, ~ / içinde olanlar tree -diçin tam bir dizin listesi (bir ağaç yapısında) yapabilir ve alabilirsiniz.


Düz metne ihtiyacım var, yeni satır alt dizinlerin listelenmesiyle, ağaç "ağaç" yapısını ekliyor gibi görünüyor. Ve devre dışı bırakmak için bir bayrak bulamıyorum.
Nemo

2
@ Capt.Nemo: Düz bir liste için şunu kullanın: tree -dfi ... toplam dizin sayısının--noreport son gösterimini bastırmak için ekleyebilirsiniz .
Peter.O

3

OP, istediği çıktı biçimini belirtmiyor ("alt klasörlerin düz listelenmesi" dışında).

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

İsteğe bağlı olarak sondaki kaldırma :ile |sed -e 's/:$//'ya da biçimlendirmek |awk '{printf("%-92s \n",$0)}'vs.



0

Bash için:

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

Son eğik çizgi / liste yalnızca dizinler.

Seçenek globstaraktive edilir **.
Seçenek nullglobhiçbir şeyle eşleşen bir * öğesini kaldırır. Nokta ile başlayan dosyaları dahil etme
seçeneği dotglob(gizli dosyalar)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.