Я пытаюсь найти много папок, все без скобок. Это папки с фильмами, примерно так:
Zombie Flesh Eaters (1979) [tmdb-7219]
Zombieland (2009) [tmdb-19908]
Zombieland Double Tap (2019) [tmdb-338967]
Но мне нужно найти те, БЕЗ [tmdb ] скобка.
Я не знаю, как это сделать?
Быстрое редактирование:
Пытался использовать reg-ex \ [. *? \]
, чтобы найти все с скобка в нем, но я не уверен, что это работает должным образом (я не так хорошо разбираюсь в регулярных выражениях, но использование тестера reg-ex подтверждает, что он ищет что-либо внутри скобок).
Но мне нужно найти папки БЕЗ скобок .. И я не знаю, как это сделать
Это можно было бы сделать легко.
ls -Aq1 | grep -Pv '.*\[tmdb-\d+\].*'
Трубопровод после ls
считается плохой вещью в целом, однако, я предполагаю, что все папки не названы странно, потому что они просто папки фильмов, поэтому я думаю, что трубопровод после ls
здесь хорош.
Я не тестировал его, но я уверен, что он должен работать.
Кроме того, я предполагаю, что вы будете помещать эти папки в цикл, чтобы добавить идентификатор к имени. Чистая догадка, но я предполагаю. Тогда это удобно, потому что вывод ls (из-за -.. 1
) будет в списке. Таким образом, вы можете легко сделать это для обработки папок по одной:
ls -Aq1 | grep -Pv '.*\[tmdb-\d+\].*' | \
while read -r level
do
...
done
или
ls -Aq1 | \
while read -r level
do
if ! echo "$level" | grep -Pq '.*\[tmdb-\d+\].*'
then
...
fi
done
Если вам не нужно искать рекурсивно, то оболочка bash extglob
может выполнять отрицание с помощью ! (шаблон)
, например
shopt -s extglob
printf '%s\n' !(*\[tmdb-*\]*)/
Параметр extglob
, вероятно, включен по умолчанию в интерактивной оболочке bash. Замыкание /
необходимо только в том случае, если вам нужно исключить простые файлы из матча - эквивалентно типу команды
. find
-d
Например, если получить каталог с contents
$ ls
'Zombie Flesh Eaters (1979) [something else here]' 'Zombieland (2009) [tmdb-19908]'
'Zombie Flesh Eaters (1979) [tmdb-7219]' 'Zombieland Double Tap (2019) [tmdb-338967]'
'Zombieland (2009)'
then
$ printf '%s\n' !(*\[tmdb-*\]*)/
Zombie Flesh Eaters (1979) [something else here]/
Zombieland (2009)/
или
$ ls -d !(*\[tmdb-*\]*)/
'Zombie Flesh Eaters (1979) [something else here]/' 'Zombieland (2009)/'
В отличие от find
, он не будет соответствовать скрытым каталогам по умолчанию (хотя вы можете включить их, установив shopt -s dotglob
).
Если вам do нужно выполнить рекурсивный поиск, вы можете добавить shopt -s globstar
и использовать **/! (*[tmdb-*]*)/
, хотя в этом случае я, скорее всего, выберу find
.
find
имеет оператор -not
. Сообщите ему, где искать, какой элемент искать (например, -тип d
, чтобы найти только папки) и чего не должно быть в имени, например -not -name '* \ [* \] '
. Таким образом
find /somewhere -type d -not -name '*\[*\]'