Да: вам нужно использовать внешние тома (либо собственные тома Docker, либо каталоги хоста), это не является обязательным. Удаление и воссоздание контейнеров - это чрезвычайно рутина (вам нужно сделать это, чтобы установить исправление безопасности в программном обеспечении базы данных или в среде распространения Linux, если ничего больше), и если вы удалите контейнер, вы потеряете все данные был в нем.
Типичный вызов PostgreSQL будет выглядеть следующим образом:
docker run \
--name postgres \
-d \
-p 5432:5432 \
-v $PWD/pgdata:/var/lib/postgresql/data \
postgres:11
https://hub.docker.com/_/postgres/ перечисляет все переменные среды и пути к файловой системе контейнера. которые интересны типичному пользователю.
Некоторые regex библиотеки позволяют предвидение:
somefile(?!16\.txt$).*?\.txt
Иначе можно все еще использовать несколько классов символов:
somefile([^1].|1[^6]|.|.{3,})\.txt
или, для достижения максимальной мобильности:
somefile([^1].|1[^6]|.|....*)\.txt
[^(16)]
средства: Соответствуйте любому символу, но фигурным скобкам, 1, и 6.
Чтобы повиноваться строго к Вашей спецификации и быть придирчивым, необходимо скорее использовать:
^somefile_(?!16\.txt$).*\.txt$
так, чтобы somefile_1666.txt, который является {что-либо}, мог быть подобран ;)
но иногда это просто более читаемо для использования...:
ls | grep -e 'somefile_.*\.txt' | grep -v -e 'somefile_16\.txt'
Лучшее решение было уже упомянуто:
somefile_(?!16\.txt$).*\.txt
Это работает и достаточно жадно для взятия чего-либо прибывающего в него на той же строке. Если Вы знаете, однако о желании имени правильного файла я предложил бы также ограничить недопустимые символы:
somefile_(?!16)[^?%*:|"<>]*\.txt
Если Вы работаете с regex механизмом, который не поддерживает предвидение, необходимо будет рассмотреть, как составить это! 16. Можно разделить файлы на две группы, те, которые запускаются с 1 и не сопровождаются 6, и те, которые запускаются с чего-либо еще:
somefile_(1[^6]|[^1]).*\.txt
Если Вы хотите позволить somefile_16_stuff.txt, но НЕ somefile_16.txt, эти regexes выше недостаточно. Необходимо будет установить предел по-другому:
somefile_(16.|1[^6]|[^1]).*\.txt
Объедините это все, и Вы заканчиваете с двумя возможностями, та, которая блокирует единственный экземпляр (somefile_16.txt) и тот, который блокирует все семейства (somefile_16*.txt). Я лично думаю, что Вы предпочитаете первый:
somefile_((16[^?%*:|"<>]|1[^6?%*:|"<>]|[^1?%*:|"<>])[^?%*:|"<>]*|1)\.txt
somefile_((1[^6?%*:|"<>]|[^1?%*:|"<>])[^?%*:|"<>]*|1)\.txt
В версии, не удаляя специальные символы, таким образом, легче читать:
somefile_((16.|1[^6]|[^1).*|1)\.txt
somefile_((1[^6]|[^1]).*|1)\.txt
Иногда просто легче использовать два регулярных выражения. Сначала ищите все, что Вы хотите, затем игнорируете все, что Вы не делаете. Я делаю это все время на командной строке, где я передаю по каналу regex, который получает надмножество в другой regex, который игнорирует материал, который я не хочу.
Если цель состояла в том, чтобы сделать задание, а не найти идеальный regex, рассмотреть тот подход. Часто намного легче записать и понять, чем regex, который использует экзотические функции.
somefile_(?!16).*\.txt
(?! 16) средства: Утверждайте, что невозможно соответствовать regex "16", запускающемуся в том положении.
Не используя предвидение
somefile_(|.|[^1].+|10|11|12|13|14|15|17|18|19|.{3,}).txt
Считайте его как: somefile_
сопровождаемый также:
1
и сопровождаемый любыми другими символами.10
.. 19
отметьте это 16
был не учтен.и наконец сопровождаемый .txt
.