Я пытаюсь ls
каталоги, в которых есть .png
файлы (нет необходимости в рекурсивности, хотя это было бы очень полезно), кроме одного. Исключить один каталог, т.е.
ls */*.png
работает отлично.
ls (^one)*/*.png
не возвращает стандартный вывод. Как мне этого добиться?
Я слепой и обманываю это espeak
, таким образом, я могу только слышать стандартный вывод пока.
one
(правильный шаблон будет^one/*.png
), он будет печатать все.Ответы:
Вариант 1 - используя просто
ls
:с включенным расширенным bash globbing (
shopt -s extglob
) вы можете сделать:Вариант 2 - объединение
ls
иgrep
:Вы можете комбинировать
ls
сgrep -v
ls */*.png | grep -v "one/"
Вариант 3 - (лучший ИМО), но
find
не используетls
:Для рекурсивного поиска по всем подкаталогам используется
find
Все вышеперечисленные строки содержат список каталогов с
.png
файлами, отфильтровывая любые путиone/
; только вариант 3 будет делать это рекурсивно.источник
find
нужно говорить-path "*/one/*"
или-path "./one/*"
?./phone/handset.png
?.png
s в каталоге с именемphone
? Я думал, что мы просто пытались исключитьone
?-not
, это означает, что он вызываетfind
исключение файлов в каталоге с именемphone
.В Zsh , положить
setopt extended_glob
в вашей~/.zshrc
. Затем вы можете использовать шаблон подстановки,^one
чтобы исключить каталог с именемone
.Если вы хотите перейти в подкаталоги, используйте
**/
для рекурсивного сглаживания. Чтобы исключить каталог, вызываемыйone
на верхнем уровне, а также каталог верхнего уровня:Чтобы исключить файлы в вызываемом подкаталоге
one
, но не файлы в его подкаталогах:Чтобы исключить файлы в подкаталоге, вызываемом
one
на любом уровне, используйте шаблон повторения с#
оператором вокруг отрицания:источник