Polecenie Linux do wydrukowania struktury katalogów w formie drzewa

510

Czy jest jakieś polecenie linux, które mogę wywołać ze skryptu Bash, który wypisuje strukturę katalogów w formie drzewa, np.

folder1
   a.txt
   b.txt
folder2
   folder3
użytkownik243655
źródło
7
Po prostu biegnij find. Lub find . -not -path '*/\.*'ukryć pliki i foldery zaczynające się od .. Jeśli chcesz mieć wynik ze spacjami, jak w pytaniu, użyj go ze skryptem „znajdź 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]"
użytkownik
11
Czy takie pytania nie powinny być migrowane do SuperUser, a nie zamknięte?
Balmipour,
12
nie sądzę, że to pytanie zasługuje na zamknięcie jako „nie na temat”. Tagi wydają się mieć rację.
Sanket Berde
14
Polityka zamykania pytań bez migracji jest szkodliwa zarówno dla przepełnienia stosów, jak i ogólnie dla ludzkiej wiedzy. W ciągu ostatnich 3 dni każde pytanie, na które natknąłem się w wyszukiwarce Google, zostało zamknięte z podobnych powodów i nie było już mowy o żadnej aktywności. Oznacza to, że nikt nie może go zaktualizować, nikt nie może udzielić lepszej odpowiedzi, a to sprawia, że ​​stackoverflow wygląda na krótkowzrocznego lub elitarnego. Przepełnienie stosu powinno rozważyć wymaganie migracji, gdy zostanie znaleziony temat spełniający te warunki.
Nay
5
Zgadzam się z @NickYeates Jestem tu pod koniec września 2017 r. I wciąż znajduję odpowiedzi na to samo pytanie. Myśl długoterminowo, projektując te zasady dotyczące pytań i odpowiedzi!
Alex

Odpowiedzi:

773

Czy tego szukasz drzewa ? Powinien być w większości dystrybucji (być może jako instalacja opcjonalna).

~> 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

próbka pobrana ze strony internetowej opiekuna.

Możesz dodać opcję, w -L #której #jest zastępowana liczbą, aby określić maksymalną głębokość rekurencji.

Usuń, -daby wyświetlić również pliki.

podstępny
źródło
54
Uwaga dla każdego widzącego to: usuń, -daby wyświetlić także pliki!
Afr
29
Uwaga dla każdego, kto to zobaczy: strona
podręcznika
42
Aby zainstalować w systemie Mac OS X z Homebrew: brew install tree
funfuntime
2
Aby zainstalować na cygwin apt-cyg install tree(zakładając, że zainstalowałeś apt-cyg)
blockloop
2
Nawet Ubuntu 16.04 nie jest w to wyposażony. Użyj apt-get install treego zainstaluje.
Romeo Sierra,
331

Możesz użyć tego:

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

W ciągu kilku sekund pokaże graficzną reprezentację bieżących podkatalogów bez plików , np . /var/cache/:

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

Źródło

Soufiane Hassou
źródło
7
Jeśli chcesz ze spacjami, bardziej jak żądany PO, to: ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g' -e 's/^/ /'
Ben
w jakikolwiek sposób mogę sprawić, że zignorują pliki dot? Np. Zapobiec wyświetlaniu zawartości .git?
GMA,
@GeorgeMillo zobacz mój komentarz
użytkownik
32
Nie drukuje plików.
Tomáš Zato - Przywróć Monikę
36
z plikami: find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
JavaSheriff
18

Aby dodać rozwiązanie Hassou do swojego .bashrc, spróbuj:

alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/   /'"'"' -e '"'"'s/-/|/'"'"
RussellStewart
źródło
6
Uważaj na znak nowej linii na końcu pierwszego wiersza, jeśli kopiujesz go bezpośrednio
Rahul
2
Niezły alias. Ale na końcu brakuje ”(2 znaki pojedynczego cudzysłowu). Działa nawet bez niego, ale ... jeśli chcesz dodać więcej poleceń na końcu, zobaczysz, że literał nie jest kompletny. Więc powinno iść alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"''
Hero Qu
6

To polecenie działa, aby wyświetlać zarówno foldery, jak i pliki .

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

Przykładowe dane wyjściowe:

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

Źródło: Komentarz @javasheriff tutaj . Zanurzony jako komentarz i opublikowanie go jako odpowiedzi pomaga użytkownikom łatwo go dostrzec.

Pavan Kumar
źródło
dla python3 działam find . |grep -vE 'pyc|swp|__init' | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"dobrze
patroqueeet
3

Upiększam wynik odpowiedzi @ Hassou za pomocą:

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

To bardzo przypomina dane wyjściowe tree:

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

Możesz także utworzyć alias:

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

BTW, treenie jest dostępny w niektórych środowiskach, takich jak MinGW. Więc zastępca jest pomocny.

Robert
źródło
gitbash na Windowsie nie lubi ostatniego wyrażenia, mówi, że nie jest zakończone
Leos Literak