我有一个我在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
}
答案 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
}