트리 형태로 디렉토리 구조를 인쇄하는 Linux 명령


510

디렉토리 구조를 트리 형태로 인쇄하는 Bash 스크립트에서 호출 할 수있는 Linux 명령이 있습니까?

folder1
   a.txt
   b.txt
folder2
   folder3

7
그냥 실행하십시오 find. 또는 find . -not -path '*/\.*'로 시작하는 파일 및 폴더를 숨길 수 있습니다 .. 질문에서와 같이 공백이있는 출력을 원할 경우 다음 "find prettifier"스크립트와 함께 사용하십시오.find . -not -path '*/\.*' | python -c "import sys as s;s.a=[];[setattr(s,'a',list(filter(lambda p: c.startswith(p+'/'),s.a)))or (s.stdout.write(' '*len(s.a)+c[len(s.a[-1])+1 if s.a else 0:])or True) and s.a.append(c[:-1]) for c in s.stdin]"
— user

11
그러한 질문이 닫히지 않고 수퍼 유저에게 이전되어서는 안됩니까?
— Balmipour

12
나는이 질문이 "주 제외"로 닫힐 가치가 있다고 생각하지 않는다. 태그가 올바른 것 같습니다.
— Sanket Berde

14
마이그레이션하지 않고 질문을 닫는 정책은 일반적으로 스택 오버플로와 인간 지식에 해 롭습니다. 지난 3 일 동안 Google에서 검색 한 모든 질문은 비슷한 이유로 추론되었으며 더 이상 활동을 할 수 없었습니다. 이것은 아무도 그것을 업데이트 할 수 없으며 아무도 더 나은 답변을 줄 수 없으며 스택 오버 플로우가 근시안적이거나 엘리트리스트처럼 보이게합니다. Stackoverflow는 주제에 이러한 조건이있을 때 마이그레이션이 필요한지 고려해야합니다.
— Nay

5
나는 2017 년 9 월 말 에이 동일한 질문에 대한 답변을 여전히 찾고있는 @NickYeates에 동의합니다. 이러한 질문 및 답변 정책을 설계 할 때 장기적으로 생각하십시오!
— Alex

답변:


774

이것이 당신이 찾고있는 나무 입니까? 대부분의 배포판에 있어야합니다 (선택적 설치 일 수 있음).

~> tree -d /proc/self/
/proc/self/
|-- attr
|-- cwd -> /proc
|-- fd
|   `-- 3 -> /proc/15589/fd
|-- fdinfo
|-- net
|   |-- dev_snmp6
|   |-- netfilter
|   |-- rpc
|   |   |-- auth.rpcsec.context
|   |   |-- auth.rpcsec.init
|   |   |-- auth.unix.gid
|   |   |-- auth.unix.ip
|   |   |-- nfs4.idtoname
|   |   |-- nfs4.nametoid
|   |   |-- nfsd.export
|   |   `-- nfsd.fh
|   `-- stat
|-- root -> /
`-- task
    `-- 15589
        |-- attr
        |-- cwd -> /proc
        |-- fd
        | `-- 3 -> /proc/15589/task/15589/fd
        |-- fdinfo
        `-- root -> /

27 directories

관리자의 웹 페이지에서 가져온 샘플.

당신은 옵션을 추가 할 수 있습니다 최대 재귀 깊이를 지정하는 숫자로 대체됩니다.-L ##

-d파일도 표시하려면 제거하십시오 .


54
이것을 보는 방문자를위한 참고 사항 : -d파일을 표시하려면 제거하십시오 !
— Afr

29
: 당신을 위해 남자 페이지에는 더 플래그 봐서이 보는 모든 방문자에 대한 참고
— oivvio

43
Homebrew가있는 Mac OS X에 설치하려면 : brew install tree
— funfuntime

2
cygwin에 설치하려면 apt-cyg install tree(apt-cyg를 설치했다고 가정)
— blockloop

2
우분투 16.04조차도 이것과 함께 제공되지 않습니다. 사용 apt-get install tree하면 설치됩니다.
— Romeo Sierra

331

이것을 사용할 수 있습니다 :

ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'

다음 과 같이 몇 초 안에 파일 이 없는 현재 하위 디렉토리의 그래픽 표현이 표시 됩니다 /var/cache/.

   .
   |-apache2
   |---mod_cache_disk
   |-apparmor
   |-apt
   |---archives
   |-----partial
   |-apt-xapian-index
   |---index.1
   |-dbconfig-common
   |---backups
   |-debconf

출처


7
OP와 같이 공백이 필요한 경우 다음과 같이하십시오. ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g' -e 's/^/ /'
— Ben

내가 이것을 도트 파일을 무시하게 만들 수있는 방법은 무엇입니까? 예를 들어 .git?
— GMA


32
파일을 인쇄하지 않습니다.
— Tomáš Zato-복원 모니카

36
파일 : find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
— JavaSheriff

18

.bashrc에 Hassou의 솔루션을 추가하려면 다음을 시도하십시오.

alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/   /'"'"' -e '"'"'s/-/|/'"'"

6
직접 복사하는 경우 첫 번째 줄 끝에서 줄 바꿈 문자를주의하십시오
— Rahul

2
좋은 별칭. 그러나 끝에 ''(작은 따옴표 2 개)가 없습니다. 그것 없이도 작동하지만 ... 끝에 명령을 더 추가하려면 리터럴이 완료되지 않은 것을 볼 수 있습니다. 그래서 가야한다 alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"''
— Hero Qu

6

이 명령은 폴더와 파일을 모두 표시합니다 .

find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"

출력 예 :

.
 |-trace.pcap
 |-parent
 | |-chdir1
 | | |-file1.txt
 | |-chdir2
 | | |-file2.txt
 | | |-file3.sh
 |-tmp
 | |-json-c-0.11-4.el7_0.x86_64.rpm

출처 : @javasheriff에서 코멘트 여기 . 댓글로 잠기고 답변으로 게시하면 사용자가 쉽게 확인할 수 있습니다.


python3을 위해 내가 발견 find . |grep -vE 'pyc|swp|__init' | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"잘 작동
— patroqueeet

3

@Hassou의 답변 출력을 확인하고 있습니다.

ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//──/g' -e 's/─/├/' -e '$s/├/└/'

이것은 tree지금 의 결과와 매우 유사합니다 .

.
├─pkcs11
├─pki
├───ca-trust
├─────extracted
├───────java
├───────openssl
├───────pem
├─────source
├───────anchors
├─profile.d
└─ssh

별명을 만들 수도 있습니다.

alias ltree=$'ls -R | grep ":$" | sed -e \'s/:$//\' -e \'s/[^-][^\/]*\//──/g\' -e \'s/─/├/\' -e \'$s/├/└/\''

BTW tree는 MinGW와 같은 일부 환경에서는 사용할 수 없습니다. 따라서 대안이 도움이됩니다.


창에 gitbash는 마지막 표현을 좋아하지 않는다, 그것은 종료되지 않았다고 말한다
— Leos Literak

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