bash有选择地将文件/文件夹复制到另一个位置

时间:2011-01-10 10:16:34

标签: linux bash shell explode

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

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

对于没有/的元素,我需要复制整个文件夹及其内容 - 例如ajaxtemplatesuploadify。但是对于那些有斜杠的人 - 比如style/prod_styles(注意可以有多个斜杠),我只需要复制最后一个元素(例如/path/to/some/folder我需要只复制folder及其如果目标中不存在父文件夹(例如pathtosome是父文件夹),我需要创建这些文件夹,然后复制最后一个元素(folder)。

之前我猜测在循环中使用explode()进行爆炸(如PHP的/)很容易,然后按照上面的内容从{({1}}目录递归开始例子)检查它的子目录是否存在,如果没有创建它,直到我们完成要复制的文件/目录的父目录,然后进行最终复制。

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

谢谢,
Sandeepan

3 个答案:

答案 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:

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

答案 2 :(得分:0)

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

case "$var" in
  */*) echo "I have a slash" ;;
  *)   echo "no slash for me" ;;
esac