0

我的脚本中有一个循环,它遍历一个数组 -myArray我需要在每次迭代时复制一些文件/目录。数组可以是这样的 -

myArray=('ajax' 'style/prod_styles' `path/to/some_file.php` 'templates' 'uploadify')

使用这个数组,对于没有 a 的元素/,我需要复制整个文件夹及其内容 -例如ajax, templates. uploadify但是对于那些有斜线的人——比如style/prod_styles(注意可以有多个斜线),我只需要复制最后一个元素(例如,/path/to/some/folder我只需要复制folder它的内容),并且如果目标文件夹中不存在父文件夹(例如path,,tosome父文件夹),我只需要创建这些文件夹,然后复制最后一个元素(folder)。

explode()早些时候我猜想在循环内部做一个爆炸(如 PHP 的)会很容易/,然后递归地从父path目录开始(根据上面的例子的目录)检查它的子目录是否存在,如果不创建它,直到我们完成与要复制的文件/目录的父级,然后进行最终复制。

但是,如果 bash 中有更简单的方法可以做到这一点,请告诉我。

谢谢,
桑迪潘

4

3 回答 3

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}"
于 2011-01-10T10:28:53.457 回答
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:

更新示例代码以处理常规文件和目录。

于 2011-01-10T10:30:38.930 回答
0

一种测试字符串是否包含斜杠的技术:

case "$var" in
  */*) echo "I have a slash" ;;
  *)   echo "no slash for me" ;;
esac
于 2011-01-10T11:18:53.100 回答