Linux cp命令可以';t分析包含通配符的路径

Linux cp命令可以';t分析包含通配符的路径,linux,bash,Linux,Bash,我在bash中编写了一个复制文件的函数。 编写它是为了减少将使用xcopy的批处理脚本转换为bash脚本的痛苦。这是因为Linux中的copy命令的工作方式略有不同。 该函数执行以下几项操作: 如果目标目录还不存在,它将创建一个到目标目录的路径 它使用cp复制文件 它使用cp-r复制目录 它使用rsync-arv--exclude from=复制给定目录中的所有文件和文件夹,但FILE 问题是,当我尝试使用*复制文件时,会出现错误: cp:无法统计“包含*的某些目录”:没有此类文件或目录 我

我在bash中编写了一个复制文件的函数。 编写它是为了减少将使用xcopy的批处理脚本转换为bash脚本的痛苦。这是因为Linux中的copy命令的工作方式略有不同。 该函数执行以下几项操作:

  • 如果目标目录还不存在,它将创建一个到目标目录的路径
  • 它使用
    cp
    复制文件
  • 它使用
    cp-r
    复制目录
  • 它使用
    rsync-arv--exclude from=
    复制给定目录中的所有文件和文件夹,但
    FILE
问题是,当我尝试使用
*
复制文件时,会出现错误:

cp:无法统计“包含*的某些目录”:没有此类文件或目录

我发现我可以这样写:
cp”/“*”
,命令本身也可以工作。但当我尝试将其传递给我的函数时,它会得到3个参数,而不是2个。 如何在函数中使用
cp
命令,同时能够传递包含通配符的路径?这意味着参数将在路径的开头和结尾使用双引号,例如:
Copy/*.zip”“


好吧,所以我不能用别人给我的建议来解决这个问题。发生的情况是*在发送到函数之前正在扩展,或者它在函数内部根本不会扩展。我尝试了不同的方法,最终我决定重写这个函数,这样它就可以支持多个参数。 通配符的扩展发生在它发送到my函数之前,copy函数执行它以前执行的所有操作,同时支持多个要复制的文件/目录

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
}

通配符“*”由bash而不是cp命令解析。您可以使用Copy“/“*”.zip“”,但我的Copy函数将获得3个参数,而不是2个。对于bash,请在脚本中尝试cp$(echo$1)$2。我刚刚将您的函数粘贴到我的终端中,并且
Copy foo.*.bar/
工作正常;它创建了目录并复制了文件。你说的是一个文件名,里面有一个文本
*
?我说的是当你在路径中使用引号时。有时,路径中有空格,因此必须使用引号。尝试:复制“somePath/foo.*”bar/GNU
cp
命令支持在您的场景中使用
-t
传递目标目录;如果[$?-ne 0];那么…就是
如果!傅;那么…
@tripleee你是说写一些像if!cp“${argumentsArray[@]}”;然后从1号出口离开,你说通过目的地是什么意思?你能举个例子吗?
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
}