하위 디렉토리를 재귀 적으로 나열하려면 어떻게해야합니까?


47

명백한

ls -dR

작동하지 않습니다.

나는 현재 사용하고 있습니다

find /path/ -type d -ls

그러나 출력이 필요한 것은 아닙니다 (하위 폴더의 일반 목록)

탈출구가 있습니까?


다음은 색상으로 디렉토리 트리를 인쇄하는 멋진 bash 스크립트입니다. 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'인수는 선택 사항입니다. 기본값입니다. 또한 특정 리스팅 형식이 필요한 경우 원하는 옵션으로 ls를 실행하기 위해 xargs로 공급 될 수 있습니다 (예 :) find /path/ -type d -print0 | xargs -0 -r ls -ld. NULL로 종료 된 출력 및 일치하는 -0 xargs arg의 경우 -print0에 유의하십시오.
cas

그리고 우연히 Windows와 cygwin에서이를 실행하는 경우 Windows에는 이미 find명령이 있으므로 cygwin의 bin 폴더 경로를 지정해야합니다.
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/^/ |/"center.sh/tree
Dem Pilafian

9

"트리"패키지는 ArchLinux와 Ubuntu 모두에서 "트리"라고합니다.

따라서 ~ / 인 경우 ~ /에 tree -d있는 모든 항목에 대한 전체 디렉토리 목록 (트리 구조로)을 가져오고 얻을 수 있습니다


tree는 "tree"구조를 추가하는 것 같지만 일반 텍스트, 줄 바꾸기로 구분 된 하위 디렉토리 목록이 필요합니다. 그리고 비활성화 할 플래그를 찾지 못하는 것 같습니다.
니모

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

bash의 경우 :

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

마지막 슬래시 / 목록 만 디렉토리.

옵션이 globstar활성화됩니다 **.
옵션 nullglob은 일치하지 않는 *를 제거합니다. 점으로 시작하는 파일 (숨겨진 파일)을 포함하는
옵션dotglob

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.