Как мне найти папки без определенного имени?

Я пытаюсь найти много папок, все без скобок. Это папки с фильмами, примерно так:

Zombie Flesh Eaters (1979) [tmdb-7219]
Zombieland (2009) [tmdb-19908]
Zombieland Double Tap (2019) [tmdb-338967]

Но мне нужно найти те, БЕЗ [tmdb ] скобка.

Я не знаю, как это сделать?

Быстрое редактирование: Пытался использовать reg-ex \ [. *? \] , чтобы найти все с скобка в нем, но я не уверен, что это работает должным образом (я не так хорошо разбираюсь в регулярных выражениях, но использование тестера reg-ex подтверждает, что он ищет что-либо внутри скобок).

Но мне нужно найти папки БЕЗ скобок .. И я не знаю, как это сделать

0
задан 29 June 2021 в 17:53

3 ответа

Это можно было бы сделать легко.

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
1
ответ дан 28 July 2021 в 11:23

Если вам не нужно искать рекурсивно, то оболочка 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.

0
ответ дан 28 July 2021 в 11:23

find имеет оператор -not . Сообщите ему, где искать, какой элемент искать (например, -тип d , чтобы найти только папки) и чего не должно быть в имени, например -not -name '* \ [* \] '. Таким образом

find /somewhere -type d -not -name '*\[*\]'
2
ответ дан 28 July 2021 в 11:23

Другие вопросы по тегам:

Похожие вопросы: