me@s:/tmp$ mkdir -p test/raw test/{a,b,c}/data/x
me@s:/tmp$ tree test/
test/
├── a
│ └── data
│ └── x
├── b
│ └── data
│ └── x
├── c
│ └── data
│ └── x
└── raw
I need to exclude test/raw and test/b/data but tree -I only want folder names:
me@s:/tmp$ tree test -I 'raw|b/data'
test
├── a
│ └── data
│ └── x
├── b
│ └── data
│ └── x
└── c
└── data
└── x
Without the b/data
that exclude all data folders:
me@s:/tmp$ tree test -I 'raw|data'
test
├── a
├── b
└── c
me@s:/tmp$
CodePudding user response:
As of the current version of tree
(v2.0.2), this is not possible.
The pattern is applied to the filename only (the d_name
member of the a struct dirent
).
See here, the getinfo
function gets called from here.
CodePudding user response:
The options -P
and -I
of the tree
command, only work on the file-names and not on the path-names of the file [1].
Having hat said, you could use grep
to extract the wanted information:
$ tree -f test | grep -vE '(raw|b/data)'
test
├── test/a
│ └── test/a/data
│ └── test/a/data/x
├── test/c
│ └── test/c/data
│ └── test/c/data/x
Here, we make use of the flag -f
which prints the relative path-name with respect to the directory test
. The grep
command does the rest.
As you notice, the exclusion of raw
does not allow for a clean tree-output as you have spurious |
's .
Notes:
- in Linux, everything is a file.