polecenie drzewa dla wielu obejmuje i wyklucza

33

Czy możesz podać przykład użycia polecenia drzewa do odfiltrowania wyniku w następujący sposób:

  • ignorować katalogi (powiedzmy bin, unitTest)
  • wymieniając tylko niektóre pliki posiadające rozszerzenia (powiedzmy .cpp, .c, .hpp, .h)
  • podając pełne nazwy ścieżek tylko wynikowych plików spełniających kryteria.
Linda
źródło

Odpowiedzi:

54

Jednym ze sposobów jest użycie wzorców z przełącznikami -Ii -P:

tree -f -I "bin|unitTest" -P "*.[ch]|*.[ch]pp." your_dir/

-fDrukuje pełną ścieżkę do każdego pliku, a -Inie obejmuje pliki w strukturze tutaj oddzielone pionową kreską. Do -PPakiet obejmuje przełącznik tylko pliki wymienione we wzorze pasującym pewną rozszerzenie.


źródło
6
Uwaga: nie dołączaj ukośników do flagi -I, np . -I binNie -I bin/.
ThorSummoner,
robi to błądsed: illegal option -- I
François Romain
4

użyj findi użyj treepolecenia find, pruneaby wykluczyć katalogi wyszukiwania i użyć tree -Pdo wyszukiwania wzorca.

Użyj przełącznika przycinania, na przykład jeśli chcesz wykluczyć misckatalog, po prostu dodaj -path ./misc -prune -opolecenie do polecenia find.

na przykład find . -path ./misc -prune -o -exec tree -P <pattern> {} \;lub możesz użyć-name "*.cpp" in find

do wykluczenia korzystania z wielu katalogów

find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o

harish.venkat
źródło
Dla mnie przykład z poleceniem find podaje błąd „znajdź: oczekiwane wyrażenie po '-o'”
WebComer
próbowałeś właśnie find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -olubfind . -path ./misc -prune -o -exec tree -P *.cpp {} \;
harish.venkat
2

Prawdziwym rozwiązaniem jest wyprowadzenie pełnych ścieżek, odfiltrowanie niechcianych ścieżek, a na końcu naprawienie wyników.

tree -df | egrep -v "\./(bin|unitTest)/.*" | sed -r 's%\./.*/%%g'

Jeśli wszystkie pliki są potrzebne na wyjściu, usuń parametr „d”.

Szczegółowe wyjaśnienie można znaleźć na stronie: http://qaon.net/press/archives/572, jeśli rozumiesz japoński.

Afante
źródło
-f flaga bardzo przydatna!
Michael Dimmitt,