![Найти каталоги, исключая закрывающуюся скобку ')'](https://rvso.com/image/83705/%D0%9D%D0%B0%D0%B9%D1%82%D0%B8%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B8%2C%20%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B0%D1%8F%20%D0%B7%D0%B0%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D1%83%D1%8E%D1%81%D1%8F%20%D1%81%D0%BA%D0%BE%D0%B1%D0%BA%D1%83%20')'.png)
Я пытаюсь составить список всех видеокаталогов (не файлов), которые не заканчиваются на год, например, (2015)
и, более конкретно, в которых год не указан, поэтому они не заканчиваются закрывающейся скобкой )
.
Как я могу сделать наоборот:
# List all files and directories end with '(2015)'
ls -ld *\(2015\)
# List all files and directories end with ')'
ls -ld *\)
Может ли кто-нибудь объяснить, как это сделать?
решение1
Попробуй это:
ls -ld *[^\)]
[] - набор символов, которые нас интересуют
^ - отрицание (то есть мы включаем набор символов, которые нам не нужны)
\) - экранированный ')'
решение2
В bash или zsh:
for i in *; do [ -d "$i" ] && [[ ! "$i" =~ \)$ ]] && printf "%s\n" "$i"; done
Это просто переберет все файлы и каталоги в текущем каталоге и проверит, что i) они являются каталогом ( [ -d "$i" ])
и ii) их имя не заканчивается на )
( [[ ! "$i" =~ \)$ ]]
. Элементы, прошедшие оба теста, будут выведены.
Это может работать с произвольными именами файлов (который ls
не может).
решение3
Метод 1а:
ls -ld -- *[^\)]
(используется […]
шаблон расширения имени пути (подстановочный знак/шаблон):
[abc]
соответствует a
, b
, или c
;
[^abc]
соответствует всему, кроме a
, b
, или c
; поэтому [^\)]
соответствует всему, кроме )
.)
Метод 2а:
GLOBIGNORE="*)"
ls -ld -- *
Все довольно очевидно?
Оба эти метода будут сопоставлять файлы и другие объекты, которые не являются каталогами.
Обновлено с учетом предложения don_crissti, чтобы найти только каталоги:
Метод 1б:
ls -ld -- *[^\)]/
Метод 2б:
GLOBIGNORE="*)/"
ls -ld -- */
Обратите внимание, что вы должны включить /
в GLOBIGNORE
значение.
решение4
POSIXly:
find . ! -name . -prune -type d ! -name '*)'
С zsh
:
print -rl -- *[^\)](/)
Другие оболочки типа Bourne не имеют возможности фильтровать результаты подстановки. Вы можете использовать:
printf '%s\n' *[!\)]/
для соответствия только каталогам. Но это добавит завершающий слеш к результату вашего расширения. С каталогом foo
вы получите foo/
.