cp命令无法解析带有通配符的路径

时间:2016-03-03 11:51:41

标签: linux bash

我有一个我在bash中写的复制文件的函数。 编写它是因为我们将使用 xcopy 的批处理脚本转换为bash脚本会不那么痛苦。这是因为Linux中的复制命令有点不同。 该功能可以做几件事:

  • 如果目标目录尚不存在,它将创建目标目录的路径。
  • 使用cp复制文件
  • 它使用cp -r复制目录。
  • 它使用rsync -arv --exclude-from=<FILE>复制给定目录中的所有文件和文件夹,但FILE
  • 中列出的文件/文件夹除外

问题是,当我尝试使用*复制文件时,它会给我一个错误:

  

cp:无法统计'带有*的某个目录':没有这样的文件或目录。

我发现我可以编写类似的东西:cp "<dir>/"*".<extension>" "<targetDir>"并且命令本身也可以。但是当我尝试将它传递给我的函数时,它得到3个参数而不是2个。 如何在我的函数中使用cp命令,同时能够传递带通配符的路径?意思是参数在路径的开头和末尾都有双引号,例如:Copy "<somePath>/*.zip" "<targetDir>"

function Copy {
    echo "number of args is: $#"
    LastStringInPath=$(basename "$2")
    if [[ "$LastStringInPath" != *.* ]]; then
        mkdir -p "$2"
    else
        newDir=$(dirname "$2")
        mkdir -p "newDir"
    fi
    if [ "$#" == "2" ]; then
        echo "Copying $1 to $2"
        if [[ -d $1 ]]; then
            cp -r "$1" "$2"
        else
            cp "$1" "$2"
        fi  
        if [ $? -ne 0 ]; then
            echo "Error $? while trying to copy $1 to $2"
            exit 1
        fi
    else
        rsync -arv --exclude-from="$3" "$1" "$2"
        if [ $? -ne 0 ]; then
            echo "Error $? while trying to copy $1 to $2"
            exit 1
        fi
    fi
}

1 个答案:

答案 0 :(得分:0)

好的,所以我无法通过给出的建议来解决这个问题。发生的事情是*在发送功能之前正在扩展,或者它在功能内部根本不会扩展。我尝试了不同的方法,最终我决定重写函数,以便它支持多个参数。 外卡的扩展在它发送到我的函数之前发生,并且复制功能在支持多个文件/目录复制之前执行它之前正在执行的所有操作。

function Copy {
argumentsArray=( "$@" )
#Check if last argument has the word exclude, in this case we must use rsync command
if [[ ${argumentsArray[$#-1],,} == exclude:* ]]; then
    mkdir -p "$2"
    #get file name from the argument
    excludeFile=${3#*:}
    rsync -arv --exclude-from="$excludeFile" "$1" "$2"
    if [ $? -ne 0 ]; then
        echo "Error while to copy $1 to $2"
        exit 1
    fi
else
    mkdir -p "${argumentsArray[$#-1]}"

    if [[ -d $1 ]]; then
        cp -r "${argumentsArray[@]}"
        if [ $? -ne 0 ]; then
            exit 1
        fi
    else
        cp "${argumentsArray[@]}"
        if [ $? -ne 0 ]; then
            exit 1
        fi
    fi   
fi
}