检查文件是否具有适当的后缀bash

时间:2019-04-15 17:43:43

标签: bash

FileI编写了

function copyFile() {
    local source=$1
    set -x
    for dictionary in $DICT_PATH; do
        dictname=$(basename $dictionary)
        dict_prefix=${dictname%%.*}
        TARGET="gs://bucket/files"
        gsutil cp -r $dictionary  $TARGET
    done
}

我想添加一个条件以仅复制终止为.json或.xml的文件

我写了这个

function copyFile() {
    local source=$1

    set -x
    for dictionary in $DICT_PATH; do
        dictname=$(basename $dictionary)
        if [[ ${dictname: -5} == ".json"  ]] || [[ ${dictname: -5} == ".xml"  ]] ; then
            dict_prefix=${dictname%%.*}
            TARGET="gs://bucket/files"
            gsutil cp -r $dictionary  $TARGET
        fi
    done
}

但这没用。任何想法如何解决这个问题。

3 个答案:

答案 0 :(得分:1)

xml是比json短的字符串,因此您的后缀太长而无法与.xml进行比较。

#                                                      -4, not -5
if [[ ${dictname: -5} == ".json"  ]] || [[ ${dictname: -4} == ".xml"  ]] ; then

您可以使用[[ ... ]]更为简单的模式匹配工具来避免此错误。

if [[ $dictname = *.json || $dictname = *.xml ]]; then

甚至是与POSIX兼容的case语句:

case $dictname in
  *.json|*.xml) 
        dict_prefix=${dictname%%.*}
        TARGET="gs://bucket/files"
        gsutil cp -r "$dictionary"  "$TARGET"
        ;;
sac

答案 1 :(得分:0)

您可以将文件扩展名提取为${filename#*.}

这应该给出以下内容,

ext=${dictname#*.}
if [[ $ext == 'json']] || [[ $ext == 'xml' ]]; then
    # code 
fi

或者,使用正则表达式

if [[ $dictname =~ (json|xml)$ ]]; then
    # code
fi

答案 2 :(得分:0)

尝试一下:

filetype=${dictionary##*.}
if [[ "$filetype" == "json" ]] || [[ "$filetype" == "xml" ]]; then
    echo YES
fi