I'm trying to figure out if there is a way to get the UNIX command tree to display only directories that match a specific pattern. % tree -d tstdir -P '*qm*' -L 1tstdir|-- d1|-- d2|-- qm1|-- qm2`-- qm35 directoriesThe man page shows this bit about the switch.-P pattern                List only those files that match the wild-card pattern.  Note: you must use the -a option to also consider those files  beginning with a dot .' for                matching.  Valid wildcard operators are*' (any zero or more characters), ?' (any single character),[...]' (any single  character listed between                brackets (optional - (dash) for character range may be used: ex: [A-Z]), and [^...]' (any single character not listed in  brackets) and|'  sepa                rates alternate patterns.I'm assuming that the bit about ...List only those files... is the issue. Am I correct in my interpretation that this switch will only pattern match on files and NOT directories?EDIT #1@f-hauri looks to have the best reason as to why this doesn't work the way one would think from the switches available in the tree man page. I missed this bit in the BUGS section.BUGS   Tree  does not prune empty directories when the -P and -I options are   used.  Tree prints directories as it comes to them, so  cannot  accumu   late  information  on files and directories beneath the directory it is   printing.Given this limitation it looks like tree isn't the best way to accomplish an inclusive filtered list, but a exclusive filtered list would be an alternative way using the -I switch. In lieu of this it would look like either shell wildcards, the find command, or a Perl script would be a more appropriate way to accomplish this. See @f-hauri's fine answer for some of these alternative methods.
Can the UNIX command tree display only directories matching a pattern?
shell;command line;tree
Yes, it's a bug. From man page:BUGS   Tree  does not prune empty directories when the -P and -I options are   used.  Tree prints directories as it comes to them, so  cannot  accumu   late  information  on files and directories beneath the directory it is   printing.... at all, -d switch ask to not print files:    -d     List directories only.So if you WANT use this, you could:tree tstdir -P '*qm*' -L 1 | grep -B1 -- '-- .*qm'|-- id1|   `-- aqm_P1800-id1.0200.bin--|-- id165|   `-- aqm_P1800-id165.0200.bin|-- id166|   `-- aqm_P1800-id166.0200.bin--|-- id17|   `-- aqm_P1800-id17.0200.bin--|-- id18|   `-- aqm_P1800-id18.0200.bin--|-- id2|   `-- aqm_P1800-id2.0200.binAt all, if you use -L 1,   -L level          Max display depth of the directory tree.you could better use (in bash) this syntax:cd tstdirecho */*qm*orprintf %s\n */*qm*and if only dir is needed:printf %s\n */*qm* | sed 's|/.*$||' | uniqAt all, you could do this very quickly if pure bash:declare -A array;for file in  */*qm* ;do array[${file%/*}]='';done;echo ${!array[@]}This could be explained:cd tstdirdeclare -A array          # Declare associative array, (named ``array'')for file in  */*qm* ;do   # For each *qm* in a subdirectory from there    array[${file%/*}]=''  # Set a entry in array named as directory, containing nothing  doneecho ${!array[@]}         # print each entrys in array.... if there is no file matching pattern, result would display *.so for perfect the job, there left to do:resultList=(${!array[@]})[ -d $resultList ] || unset $resultList(This would be a lot quicker thandeclare -A arrayfor file in  */*qm*; do    [ $file == */*qm* ] || array[${file%/*}]=''  doneecho ${!array[@]})