基于通配符负匹配解压缩内容

时间:2013-01-10 08:00:46

标签: bash pattern-matching wildcard unzip

我在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_GBes_ES

我在阅读this后尝试了以下内容:

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_CZel_GR以及与该表达式不匹配且被允许的文件?

1 个答案:

答案 0 :(得分:2)

csel都与[!e][!ns]模式不匹配。

解压缩会排除与模式[!e][!ns]_*匹配的所有文件。要匹配此模式文件(或目录路径),必须满足以下条件:

  • 第一个符号不是e
  • 第二个符号不是ns
  • 第三个符号为_(下划线)

只有符合所有三个要求的文件才会从解压缩结果中排除。 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目录中。