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