Исключить шаблон подкаталога для команды дерева не работает

Стандартные команды Linux для этого:

  • findкоманда для поиска имен файлов, например:

    • найдите файлы с именем xyz в/tmp

      $ find /tmp -type f -name xyz
      
    • искать каталоги, имя которых содержит 'xyz' в/tmp

      $ find /tmp -type d -name '*xyz*'
      
  • команды find и grep для поиска в содержимом файла, например:

    • найти в /tmpфайлы, содержащие xyz

      $ find /tmp -type f -exec grep -l xyz {} \;
      
1
25.08.2019, 15:21
2 ответа

Будет ли это работать?

[user2@server-01 ~]$ tree myDir/
myDir/
├── A
│   └── a.jpg
├── B
│   └── a.jpg
└── b.jpg

2 directories, 3 files

Если вы хотите получить список всех файлов в myDir, файлы во всех подкаталогах имеют одинаковые имена; Самый быстрый способ — grep -v?

Либо с помощью команды find, pipe и grep -v для полного пути к файлам, которые вы хотите исключить.

[user2@server-01 ~]$ find myDir/ | grep -v "myDir/A/a.jpg"
myDir/
myDir/A
myDir/b.jpg
myDir/B
myDir/B/a.jpg

или с помощью вашего метода дерева. Но добавьте флаг -f для вывода полного списка каталогов.

[user2@server-01 ~]$ tree -f myDir/ | grep -v "myDir/A/a.jpg"
myDir
├── myDir/A
├── myDir/B
│   └── myDir/B/a.jpg
└── myDir/b.jpg

grep -E может принимать несколько параметров, разделенных вертикальной чертой. И может использоваться вместе с флагом -v.

[user2@server-01 ~]$ tree -f myDir/ | grep -vE "myDir/A/a.jpg | myDir/B/a.jpg"
myDir
├── myDir/A
├── myDir/B
└── myDir/b.jpg

2 directories, 3 files
0
28.01.2020, 00:02

У меня была такая же проблема. Действительно, я тоже заметил, что $ tree -I 'A/a.jpg'не работает

Но где есть воля, там и способ:

$ tree
.
├── A
│   ├── a.jpg
│   └── b.jpg
└── a.jpg

$ tree --fromfile <<EOF
`tree -f -i -n -F --noreport | grep -v 'A/a.jpg' | grep -v -E '\.$' | sed "s/^\.//"`
EOF
.
├── A
│   └── b.jpg
└── a.jpg

Опция PS:--fromfileдоступна только для дерева 1.8 и выше

1
28.01.2020, 00:02

Теги

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