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

13

Я пытаюсь lsкаталоги, в которых есть .pngфайлы (нет необходимости в рекурсивности, хотя это было бы очень полезно), кроме одного. Исключить один каталог, т.е.

ls */*.png

работает отлично.

ls (^one)*/*.png

не возвращает стандартный вывод. Как мне этого добиться?

Я слепой и обманываю это espeak, таким образом, я могу только слышать стандартный вывод пока.

Томас Янкус
источник
Какую оболочку вы используете? Ваш шаблон выглядит как шаблон 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 будет делать это рекурсивно.

toxefa
источник
Команде не 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

В Zsh , положить setopt extended_globв вашей ~/.zshrc. Затем вы можете использовать шаблон подстановки, ^one чтобы исключить каталог с именем one.

ls ^one/*.png

Если вы хотите перейти в подкаталоги, используйте **/для рекурсивного сглаживания. Чтобы исключить каталог, вызываемый oneна верхнем уровне, а также каталог верхнего уровня:

ls ^one/**/*.png

Чтобы исключить файлы в вызываемом подкаталоге one, но не файлы в его подкаталогах:

ls **/^one/*.png

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

ls (^one/)#/*.png
Жиль "ТАК - перестань быть злым"
источник