Bash Shell 将文件从源复制到目标的脚本

Bash Shell Script to copy files from source to destination

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

脚本名Source_pathDestination_path

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

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

希望这是清楚的,希望有人能帮助我,谢谢!

分别为参数一和二设置变量,源和目标..

src_dir=
dest_dir=

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

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

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

mkdir -p $dest_dir

如果你想使用 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代表感兴趣的路径。如果源或目标的任何目录名称包含空格,则必须将它们括在 " "


或者您可以制作一个bash脚本。

#!/bin/bash
srcpath=
dstpath=
if [ ! -d "$srcpath" ]; then
    echo "Source path: $srcpath doesn't exist"
    exit 1
fi
mkdir -p "$dstpath"
cp -r "$srcpath/*" "$dstpath"
  1. if 语句中的-d 标志是测试目录yes/no 是否存在的标志。这里有一些关于 bash file test operators and other bash comparison operators

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

  4. cp 上的 -r 标志告诉 cp 递归复制所有子目录,以及 * 指示的文件到目的地,根据需要创建这些子目录。

  5. 注意:如果任何路径组成部分包含空格,路径周围的“”是为了防止错误。

看看这个:

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

只需替换 SOURCEPATH 和 TARGETPATH 就可以了。如果 SOURCEPATH 不存在 (1),find 将显示一条错误消息,mkdir -p 将创建目录。

此脚本在 </code> 中创建整个目录结构,包括 <code>:

中的空文件夹
#!/bin/sh
[ -z "" ] && { echo "Usage: [=10=] SOURCE DEST"; exit 1; }
[ ! -d "" ] && { echo "'' does not exist or isn't a directory"; exit 1; }
cp -r "" ""

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

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

解释:

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