Sim, é um bug . De 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.
... nada, -d
pede para não imprimir arquivos:
-d List directories only.
Então, se você quiser usar isso, você pode:
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.bin
Se você usa -L 1
,
-L level
Max display depth of the directory tree.
você poderia usar melhor (no bash) essa sintaxe:
cd tstdir
echo */*qm*
ou
printf "%s\n" */*qm*
e se somente dir for necessário:
printf "%s\n" */*qm* | sed 's|/.*$||' | uniq
De forma alguma, você poderia fazer isso muito rapidamente se pure bash :
declare -A array;for file in */*qm* ;do array[${file%/*}]='';done;echo "${!array[@]}"
Isso pode ser explicado:
cd tstdir
declare -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
done
echo "${!array[@]}" # print each entrys in array.
... se não houver um padrão de correspondência de arquivos, o resultado exibirá *
.
então, para aperfeiçoar o trabalho, resta fazer:
resultList=("${!array[@]}")
[ -d "$resultList" ] || unset $resultList
(Isso seria muito mais rápido que
declare -A array
for file in */*qm*; do
[ "$file" == "*/*qm*" ] || array[${file%/*}]=''
done
echo "${!array[@]}"