2

При использовании команды дерева я бы хотел исключить листинг *.png и *.svg из вывода. Проблема в том, что каждое расширение скобки, которое я пробую, не работает. Это из-за того, как дерево обрабатывает аргументы командной строки?

tree -I *.{svg,png}
tree -I '*.{svg,png}'
tree -I '{*.svg,*.png}'
tree -I '{*.svg,*.png}'
tree -I '*.{p,s}(v,n}g'
tree -I '*.{svg|png}'

Технические характеристики:

  • GNU bash, версия 4.4.23
  • дерево v1.7.0

1 ответ1

5

-I обратный к -P ... руководство дает больше информации о том, что является приемлемым для последнего:

https://linux.die.net/man/1/tree

-P pattern

Список только те файлы, которые соответствуют шаблону подстановки.

Примечание: вы должны использовать опцию -a чтобы также рассмотреть файлы, начинающиеся с точки . для сопоставления.

Допустимые подстановочные операторы * (любые ноль или более символов) ? (любой отдельный символ), [...] (можно использовать любой отдельный символ, указанный в скобках (необязательно - (тире) для диапазона символов: например: [A-Z]), и [^...] (любой отдельный символ не перечислено в скобках) и | разделяет альтернативные шаблоны.

Там нет упоминания о синтаксисе расширения скобки оболочки {a,b} ... Это расширение обрабатывается tree , а не bash .

И, к сожалению, вы не можете указать -I несколько раз ...

Вместо этого вам нужно перечислить полные шаблоны с помощью канала (|), чтобы разделить их:

tree -I '*.svg|*.png'

Обратите внимание на использование одинарных кавычек для предотвращения расширения оболочкой звездочки (*) или переменных (вводится через доллар - $).


Обратите также внимание, что даже невозможно принудительно использовать расширение скобки оболочки, как показано ниже:

$ tree -I '*.'{svg,png}
+ tree -I '*.svg' '*.png'
*.png [error opening dir]

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .