Дерево команды UNIX может отобразить только каталоги, соответствующие шаблону?

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, или по крайней мере - ни один из вариантов с открытым исходным кодом, которые в свободном доступе.

3
21.12.2012, 22:10
2 ответа

Кто-то упомянул на 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[@]}"

)

0
27.01.2020, 21:29

Нет никакого пути к tree сделать это самостоятельно. Шаблоны не применяются к каталогам, только файлы.

Однако можно легко выполнить то, что Вы хотите путем получения списка каталогов с tree, и затем применяя шаблон соответствия с grep.

tree -d tstdir -L 1 | grep '*qm*'
2
27.01.2020, 21:29
  • 1
    Это портит вывод от дерева все же. –  slm♦ 22.12.2012, 03:02
  • 2
    @sim - Каким образом? –  ire_and_curses 22.12.2012, 03:17
  • 3
    Графика строки ASCII, которая показывает структуру каталогов. По общему признанию это не огромное соглашение, но я думал, что упомяну это. очень информативный –  slm♦ 22.12.2012, 03:20

Теги

Похожие вопросы