我有一个与我的bash shell脚本有关的问题。 基本上,我需要开发一个脚本,将某些文件从一个目录复制到另一个目录。听起来很简单,对我来说这是一个很大的挑战,我希望有些人可以帮助我。 所以脚本应该这样工作:
Scriptname Source_path Destination_path
1)第一个问题 - source_path可能不存在,我需要回显一条错误消息。
2)第二个问题 - 目标路径可能不存在,但是,我需要创建部分或全部目录,然后从源复制文件。否则,如果目录存在,我只需要复制。
希望这很清楚,希望有人可以帮助我谢谢!
答案 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"
说明:
答案 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 \;
每个-exec
标志开始执行一个shell代码块,\;
终止它。在过去,将多个命令合并为一个-exec
对我来说已经证明是有问题的,所以我为每个任务包括两个,一个。
{}
是find
的变量语法,表示当前路径find
正在遍历。
注意:--parents
标志位于cp
的Linux / GNU变体上,但并非在cp
的所有版本上都可用,因此下面的脚本与平台相关性较低。此外,您的问题特指使用脚本。
注意:SRCPATH
和DSTPATH
代表感兴趣的路径。如果源或目标的任何目录名称包含空格,则必须将它们括在" "
或者您可以制作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"
-d
语句中的if
标志是测试目录是/否的标志。以下是关于bash file test operators和other bash comparison operators
mkdir上的-p
标志告诉它根据需要填写路径中缺少的组件。如果没有-p
,mkdir
期望每个路径组件(路径的最终组件除外)都存在,否则它将失败。
cp上的-r
标志告诉cp
以递归方式将所有子目录以及*
指示的文件复制到目的地,创建必要的子目录。
注意:" "如果任何路径组件包含空格,则路径周围是为了防止错误。