我的脚本中有一个循环,它遍历一个数组 - myArray
,我需要在每次迭代时复制一些文件/目录。数组可以是这样的 -
myArray=('ajax' 'style/prod_styles' `path/to/some_file.php` 'templates' 'uploadify')
对于没有/
的元素,我需要复制整个文件夹及其内容 - 例如ajax
,templates
,uploadify
。但是对于那些有斜杠的人 - 比如style/prod_styles
(注意可以有多个斜杠),我只需要复制最后一个元素(例如/path/to/some/folder
我需要只复制folder
及其如果目标中不存在父文件夹(例如path
,to
,some
是父文件夹),我需要创建这些文件夹,然后复制最后一个元素(folder
)。
之前我猜测在循环中使用explode()
进行爆炸(如PHP的/
)很容易,然后按照上面的内容从{({1}}目录递归开始例子)检查它的子目录是否存在,如果没有创建它,直到我们完成要复制的文件/目录的父目录,然后进行最终复制。
但是,如果bash中有更简单的事情可以做到这一点,请告诉我。
谢谢,
Sandeepan
答案 0 :(得分:2)
我不是100%清楚你的意思是“只有最后一个元素”; cp
命令仅复制到目标的路径中的最后一项。我的猜测是你想保留目的地的相对路径:
path=style/prod_styles
dest=/path/to/some/folder
# Create same path structure
destPath="${dest}/$(dirname "$path")"
mkdir -p "${destPath}"
# copy src folder into correct place
cp -r "$path" "${destPath}"
请注意,当path
不包含斜杠时,这也有效。在这种情况下,dirname
会返回.
。
如果您只想使用路径的最后一部分(以便style/prod_styles
变为prod_styles
),那么您无需执行任何特殊操作:
path=style/prod_styles
dest=/path/to/some/folder
mkdir -p "${dest}"
# copy src folder into correct place
cp -r "$path" "${dest}"
答案 1 :(得分:2)
除非我误解了你的问题,否则你可能不需要使用类似爆炸的设施来达到你想要的效果。
示例:
# dir to copy to
DESTINATION='/path/to/copy/to/.'
# dir to copy from
SOURCE='.'
# list of dirs to copy
myArray=('ajax' 'style/prod_styles' 'templates' 'uploadify')
# for each directory in myArray ...
for d in "${myArray[@]}"
do
if [ -f "$d" ]; then # it this is a regular file
# create base directory
mkdir -p $DESTINATION/$(dirname "$d")
# copy the file
cp "$SOURCE/$d" $DESTINATION/$(dirname "$d")
elif [ -d "$d" ]; then # it is a directory
# create directory (including parent) if it doesn't exist
# - this does nothing if directory exists
mkdir -p "$DESTINATION/$d"
# recursive copy
cp -r "$SOURCE/$d/"* "$DESTINATION/$d/."
else
# write warning to stderr. do nothing with this entry
echo "WARNING: invalid entry $d." >&2
fi
done
更新了示例代码以维护目标中的相对路径。因此,styles/prod_styles
将被复制到$DESTINATION/styles/prod_styles
,但styles/
中的所有其他内容都不会被复制。
请注意,如果无法确定:
,则需要添加一些额外的检查DESTINATION
中指定的路径myArray
中的所有值都是有效目录(不是文件)更新示例代码以处理常规文件和目录。
答案 2 :(得分:0)
测试字符串是否包含斜杠的一种技术:
case "$var" in
*/*) echo "I have a slash" ;;
*) echo "no slash for me" ;;
esac