Bash Shell Script将文件从源复制到目标

时间:2015-04-08 15:22:51

标签: linux bash shell unix cp

我有一个与我的bash shell脚本有关的问题。 基本上,我需要开发一个脚本,将某些文件从一个目录复制到另一个目录。听起来很简单,对我来说这是一个很大的挑战,我希望有些人可以帮助我。 所以脚本应该这样工作:

Scriptname Source_path Destination_path

1)第一个问题 - source_path可能不存在,我需要回显一条错误消息。

2)第二个问题 - 目标路径可能不存在,但是,我需要创建部分或全部目录,然后从源复制文件。否则,如果目录存在,我只需要复制。

希望这很清楚,希望有人可以帮助我谢谢!

4 个答案:

答案 0 :(得分:1)

看看这个:

 find SOURCEPATH -type f | while read fname
 do 
 mkdir -p TARGETPATH/$(dirname "$fname")
 cp --parents $fname TARGETPATH
 done

只需要SOURCEPATH和TARGETPATH,你就会很好。如果SOURCEPATH不存在,则find将显示错误消息(1),mkdir -p将创建目录。

答案 1 :(得分:1)

此脚本在$2中创建整个目录结构,包括来自$1的空文件夹:

#!/bin/sh
[ -z "$2" ] && { echo "Usage: $0 SOURCE DEST"; exit 1; }
[ ! -d "$1" ] && { echo "'$1' does not exist or isn't a directory"; exit 1; }
cp -r "$1" "$2"

如果应该跳过空目录,则需要更多逻辑;除非rsync可用:

#!/bin/sh
[ -z "$2" ] && { echo "Usage: $0 SOURCE DEST"; exit 1; }
[ ! -d "$1" ] && { echo "'$1' does not exist or isn't a directory"; exit 1; }
rsync -mr "$1" "$2"

说明:

  • -z行确认第二个参数不为空
  • ! -d行确认第一个参数的目录是否存在
  • cp -r递归复制
  • rsync -mr递归复制但跳过空目录
  • &&||被广泛用于条件语句的替换(因为它们很短)

答案 2 :(得分:0)

分别为参数1和2设置变量,分别为source和dest ..

src_dir=$1
dest_dir=$2

检查目录是否存在,如果不退出

[[ -d $src_dir ]] || { echo "source dir not exist"; exit 1 ; }

创建路径中所需的所有目录

mkdir -p $dest_dir

答案 3 :(得分:0)

如果要使用find命令,请尝试以下操作:

find SRCPATH -exec mkdir -p DSTPATH/$(dirname "{}") \; -exec cp --parents "{}" DSTPATH \;
  1. 每个-exec标志开始执行一个shell代码块,\;终止它。在过去,将多个命令合并为一个-exec对我来说已经证明是有问题的,所以我为每个任务包括两个,一个。

  2. {}find的变量语法,表示当前路径find正在遍历。

  3. 注意:--parents标志位于cp的Linux / GNU变体上,但并非在cp的所有版本上都可用,因此下面的脚本与平台相关性较低。此外,您的问题特指使用脚本。

  4. 注意:SRCPATHDSTPATH代表感兴趣的路径。如果源或目标的任何目录名称包含空格,则必须将它们括在" "


  5. 或者您可以制作bash脚本。

    #!/bin/bash
    srcpath=$1
    dstpath=$2
    if [ ! -d "$srcpath" ]; then
        echo "Source path: $srcpath doesn't exist"
        exit 1
    fi
    mkdir -p "$dstpath"
    cp -r "$srcpath/*" "$dstpath"
    
    1. -d语句中的if标志是测试目录是/否的标志。以下是关于bash file test operatorsother bash comparison operators

    2. 的一些信息
    3. mkdir上的-p标志告诉它根据需要填写路径中缺少的组件。如果没有-pmkdir期望每个路径组件(路径的最终组件除外)都存在,否则它将失败。

    4. cp上的-r标志告诉cp以递归方式将所有子目录以及*指示的文件复制到目的地,创建必要的子目录。

    5. 注意:" "如果任何路径组件包含空格,则路径周围是为了防止错误。