Найти каталоги, исключая закрывающуюся скобку ')'

Найти каталоги, исключая закрывающуюся скобку ')'

Я пытаюсь составить список всех видеокаталогов (не файлов), которые не заканчиваются на год, например, (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/.

Связанный контент