Виключіть одну директорію у шаблоні відповідності `ls`


13

Я намагаюсь зробити lsрежисери, у яких є .pngфайли всередині (немає необхідності в рекурсивності, хоча це було б корисно), крім одного. Виключіть один каталог, тобто

ls */*.png

працює чудово.

ls (^one)*/*.png

не повертає жодного stdout. Як я цього досягти?

Я сліпий і перекладаю його espeak, тому поки що можу почути лише stdout.


Яку оболонку ви використовуєте? Ваш візерунок схожий на zsh, але не корисний, як би не виключав one(правильний зразок ^one/*.png), він би надрукував усе.
Жил "ТАК - перестань бути злим"

Відповіді:


16

Варіант 1 - просто за допомогою ls:
Увімкнений розширений bash globbing ( shopt -s extglob) ви можете:

ls !(one*)/*.png


Варіант 2 - комбінування lsта grep:

Ви можете комбінувати lsзgrep -v

  • напр ls */*.png | grep -v "one/"


Варіант 3 - (найкращий ІМО), але findне використовує ls:

Для рекурсивного пошуку всіх підкаталогів, що використовують find

find . -type f -name "*.png" -not -path "*/one/*"


Усі вищевказані однокласники будуть перелічувати каталоги з .pngфайлами, фільтруючи будь-яке узгодження шляху one/; тільки Варіант 3 зробить це рекурсивно.


Чи не findпотрібно команді говорити -path "*/one/*"чи -path "./one/*"?
G-Man каже: "Відновіть Моніку"

@ G-Man Ви абсолютно праві. Відредаговано вище.
toxefa

Чи все-таки це не відповідатиме ./phone/handset.png?
G-Man каже: "Відновіть Моніку"

@ G-Man Що не так із узгодженням .pngs у каталозі phone? Я думав, ми просто намагаємось виключити one?
toxefa

1
Отже, оскільки ви використовуєте його у зв’язку з -not, це означає, що це призводить findдо виключення файлів у каталозі під назвою phone.
G-Man каже: "Відновіть Моніку"

6

В зш , поклади setopt extended_globв свою ~/.zshrc. Тоді ви можете використовувати шаблон підстановки ^one для виключення каталогу, який називається one.

ls ^one/*.png

Якщо ви хочете повторно вписатись у підкаталоги, використовуйте **/для рекурсивного глобалізації. Щоб виключити каталог, викликаний oneу верхньому рівні, а також каталог топлевель:

ls ^one/**/*.png

Щоб виключити файли у підкаталозі, який називається one, але не файли у його підкаталогах:

ls **/^one/*.png

Щоб виключити файли в підкаталозі, викликаному oneна будь-якому рівні, використовуйте шаблон повторення з #оператором навколо заперечення:

ls (^one/)#/*.png
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.