Разархивируйте содержимое на основе отрицательного совпадения с подстановочными знаками

У меня есть следующее содержимое папки в zip-архиве:

ca_ES
cs_CZ
da_DK
de_CH
de_DE
el_GR
en_GB
es_ES
fi_FI
fr_FR
gl_ES
it_IT
lv_LV
mt_MT
nb_NO
nl_NL
pt_PT
ro_RO
sk_SK
sl_SI
sq_AL
sv_SE
tr_TR
vi_VN
get-new-strings.sh
lang_check.php
lang_check.txt
language_list.txt

Я разархивирую файл с помощью этой команды, где я исключаю каталоги и файлы, которые мне не нужны:

unzip -q ${ZIP_FILE} -x ${FOLDER_PATH}/documentation/* ${FOLDER_PATH}/library/pdf/help/* ${FOLDER_PATH}/library/pdf/samples/*

Теперь я пытаюсь исключить ВСЕ файлы и папки в указанном выше каталоге кроме каталогов en_GB и es_ES.

После прочтения этого я попробовал следующее:

unzip -q ${ZIP_FILE} -x ${FOLDER_PATH}/documentation/* ${FOLDER_PATH}/library/pdf/help/* ${FOLDER_PATH}/library/pdf/samples/* ${FOLDER_PATH}/lang/[!e][!ns]_*

Но в итоге содержимое разархивированного каталога выглядит следующим образом:

cs_CZ
el_GR
en_GB
es_ES
get-new-strings.sh
lang_check.php
lang_check.txt
language_list.txt
  • Почему cs_CZ, el_GR и файлы не соответствуют этому выражению и разрешены?

person cryptic ツ    schedule 10.01.2013    source источник


Ответы (1)


cs и el оба не соответствуют шаблону [!e][!ns].

При распаковке исключаются все файлы, соответствующие шаблону [!e][!ns]_*. Чтобы соответствовать этому шаблону, файл (или путь к каталогу) должен удовлетворять следующим условиям:

  • Первый символ не e
  • Второй символ не n или s
  • Третий символ — _ (подчеркивание).

Только файлы, соответствующие всем трем требованиям, исключаются из результата распаковки. cs_CZ, например, соответствует только первому и третьему.

ОБНОВЛЕНИЕ (предложение по решению): Уродливое решение, которое может сработать, — это исключить с 3 шаблонами. Предполагая, что все папки находятся в корне zip-файла:

unzip -q ${ZIP_FILE} -x [!e]?* ?[!ns]* ??[!_]*

ОБНОВЛЕНИЕ 2 (относительные пути): это должно работать:

unzip -q ${ZIP_FILE} -x ${FOLDER_PATH}/documentation/* ${FOLDER_PATH}/library/pdf/help/* ${FOLDER_PATH}/library/pdf/samples/* ${FOLDER_PATH}/lang/[!e]?* ${FOLDER_PATH}/lang/?[!ns]* ${FOLDER_PATH}/lang/??[!_]*

Обратите внимание, что при этом все файлы и папки, начинающиеся с en_ или es_, останутся в каталоге ${FOLDER_PATH}/lang.

person default locale    schedule 10.01.2013
comment
Что ж, это имеет смысл. Так должен ли я использовать синтаксис фигурных скобок и просто сопоставлять имена напрямую, как /lang/{!en_GB,es_ES}? Не уверен, что это правильный синтаксис для сопоставления отрицательных строк. - person cryptic ツ; 10.01.2013
comment
@crypticツ Насколько я понимаю, распаковка не поддерживает фигурные скобки. - person default locale; 10.01.2013
comment
Было бы мне проще просто разрешить распаковку всей папки, а затем выполнить команду rm, чтобы удалить все совпадающие нестроковые записи? Таким образом, он должен поддерживать фигурные скобки AFAIK. - person cryptic ツ; 10.01.2013
comment
Все мои папки не находятся в корне zip-папки. Я попробовал ${FOLDER_PATH}/lang/"[!e]?_*" "?[!ns]_*" "*.*", и это работает, но все еще позволяет el_GR, простите меня, если я делаю это неправильно. - person cryptic ツ; 10.01.2013
comment
Идеальный! Спасибо большое =о) - person cryptic ツ; 10.01.2013