Unix как автономный объект не существует как современная операционная система.
Как обозначено комментариями для производных Unix:
Несколько систем запустились с исходного кода Unix, но это выписывалось со временем так, чтобы никакой исходный код Unix не оставался. Самыми известными примерами является OpenSolaris, FreeBSD, NetBSD и OpenBSD.
FreeBSD 5.3 2004-08 OpenBSD 4.6 2009-10 NetBSD 5.0.2 2010-02 OpenSolaris build 135 2010-03
и клоны Unix
Было много систем, которые реализуют системные вызовы Unix, библиотеку API и команды, но которые не включали исходного исходного кода Unix. Вот маленький выбор.
Minix 1.1 1987-01 Xinu 1987-01 Minix 1.5 1989-11 Linux 0.96c 1992-07 Coherent 4.2 1994-12 Minix 2.0 1996-10 Linux 2.6.33.2 2010-04
Современные дистрибутивы не содержат исходного кода Unix, или по крайней мере - ни один из вариантов с открытым исходным кодом, которые в свободном доступе.
Кто-то упомянул на stackoverflow в trees
страница справочника, что это то, почему -P
переключатель не исключает вещи, которые не соответствуют шаблону.
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.
Таким образом, это, кажется, не возможно получить tree
отфильтровать его вывод с помощью переключателя-P.
РЕДАКТИРОВАНИЕ № 1
От вопроса я отправил на том, Так, чтобы был закрыт. Кто-то, @fhauri, разместил следующую информацию как альтернативные способы выполнить то, что я пытался сделать с tree
команда. Я добавляю их к своему ответу здесь для полноты.
-d
переключатель просит не печатать файлы:
-d List directories only.
Таким образом, если Вы ХОТИТЕ, используют это, Вы могли:
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
Вообще, если Вы используете -L 1
,
-L level
Max display depth of the directory tree.
Вы могли лучше использовать (в ударе) этот синтаксис:
cd tstdir
echo */*qm*
или
printf "%s\n" */*qm*
и если только dir необходим:
printf "%s\n" */*qm* | sed 's|/.*$||' | uniq
Вообще Вы могли сделать это очень быстро если чистый удар:
declare -A array;for file in */*qm* ;do array[${file%/*}]='';done;echo "${!array[@]}"
Это могло быть объяснено:
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.
... если бы нет никакого шаблона соответствия файла, результат отобразился бы *
. таким образом для идеального задание, там оставленное сделать:
resultList=("${!array[@]}")
[ -d "$resultList" ] || unset $resultList
(Это было бы намного более быстро, чем
declare -A array
for file in */*qm*; do
[ "$file" == "*/*qm*" ] || array[${file%/*}]=''
done
echo "${!array[@]}"
)
Нет никакого пути к tree
сделать это самостоятельно. Шаблоны не применяются к каталогам, только файлы.
Однако можно легко выполнить то, что Вы хотите путем получения списка каталогов с tree
, и затем применяя шаблон соответствия с grep
.
tree -d tstdir -L 1 | grep '*qm*'