Рейтинг:0

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

флаг bf

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

Зомби-пожиратели плоти (1979) [tmdb-7219]
Зомбилэнд (2009) [tmdb-19908]
Zombieland Double Tap (2019) [tmdb-338967]

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

Я не уверен, как это сделать?

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

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

vanadium avatar
флаг cn
Как вы находите в первую очередь? В некоторых случаях вам может помочь `grep -v`.
SDXCPTDR avatar
флаг bf
Использование этой строки `'\[.*?\]'` при использовании `find`.. Даже не уверен, что это работает правильно. Но мне нужно найти папки без скобки :)
vanadium avatar
флаг cn
Нам нужно, чтобы эта информация была в вопросе. Используйте «редактировать», чтобы уточнить ваши вопросы. Комментарии могут быть не прочитаны или могут исчезнуть в любой момент.
muru avatar
флаг us
Использует ли ваш «тестер регулярных выражений» ту же разновидность регулярных выражений, что и «найти»? `.*?` похоже на Perl, не имеет смысла использовать `?` после `*` в BRE или ERE.
SDXCPTDR avatar
флаг bf
Только что попробовал этот: https://www.regextester.com/ В результате: https://i.imgur.com/mKIBLJC.png -- еще раз извините; Я мало что знаю о регулярных выражениях:/
Рейтинг:2
флаг cn

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

найти /где-то -type d -not -name '*\[*\]'
SDXCPTDR avatar
флаг bf
Спасибо! Это сработало очень хорошо для меня. Просто добавил `-maxdepth 1` в моем случае :)
Рейтинг:1
флаг in
Cas

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

лс-Aq1 | grep -Pv '.*\[tmdb-\d+\].*'

Трубопровод после лс в целом считается плохой вещью, однако я предполагаю, что все папки не имеют странных названий, потому что они просто папки с фильмами, поэтому я думаю, что конвейер после лс здесь хорошо.

Я не проверял это, но я уверен, что это должно работать.

Кроме того, я предполагаю, что вы будете помещать эти папки в цикл, чтобы добавить идентификатор к имени. Чистая догадка, но я предполагаю. Тогда это удобно, потому что вывод ls (из-за -..1) будет в списке. Таким образом, вы можете легко сделать это, чтобы обрабатывать папки одну за другой:

лс-Aq1 | grep -Pv '.*\[tmdb-\d+\].*' | \
при чтении -r уровень
делать
   ...
сделано

или же

лс-Aq1 | \
при чтении -r уровень
делать
   если ! эхо "$ уровень" | grep -Pq '.*\[tmdb-\d+\].*'
   тогда
      ...
   фи
сделано
SDXCPTDR avatar
флаг bf
Это тоже сработало очень хорошо. Спасибо.
Рейтинг:0
флаг hr

Если вам не нужен рекурсивный поиск, то оболочка bash extglob может отрицать, используя !(шаблон) бывший.

shopt -s extglob

printf '%s\n' !(*\[tmdb-*\]*)/

extglob опция, вероятно, включена по умолчанию в вашей интерактивной оболочке bash. Отставание / необходим только в том случае, если вам нужно исключить из сопоставления простые файлы - эквивалентно найти команда тип -d.

Бывший. задан каталог с содержимым

$ лс
«Зомби-пожиратели плоти» (1979) [что-то еще здесь]» «Зомбилэнд (2009) [tmdb-19908]»
«Зомби-пожиратели плоти» (1979) [tmdb-7219] «Зомбилэнд Двойное касание (2019) [tmdb-338967]»
«Зомбилэнд (2009)»

тогда

$ printf '%s\n' !(*\[tmdb-*\]*)/
Зомби-пожиратели плоти (1979) [что-то еще здесь]/
Зомбилэнд (2009)/

или же

$ ls -d !(*\[tmdb-*\]*)/
«Зомби-пожиратели плоти» (1979) [что-то еще здесь] / «Зомбилэнд (2009) /»

в отличие найти, это не будет соответствовать скрытым каталогам по умолчанию (хотя вы можете включить их, установив shopt -s многоточие).

если ты делать нужно искать рекурсивно, можно добавить шопт -с глобстар и использовать **/!(*\[tmdb-*\]*)/ хотя я бы скорее всего выбрал найти в таком случае.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.