用于克隆目录的Shell脚本

时间:2013-03-28 10:18:05

标签: linux bash shell

我需要创建一个包含2个参数的shell脚本,每个参数都是一个有效的目录。该脚本在第一个参数指定的第一个目录中创建一个新目录,该目录与第二个参数同名,并在新创建的目录中复制第二个目录的内容(包括子目录和文件)。但它只复制扩展名为.txt的文件。

这是我到目前为止所得到的:

#!/bin/bash
if [ ! $# -eq 2 ]
then echo usage: file.sh directory1 directory2
     exit 1
fi
if [ !  -d $1  ]
then echo $1 is not a directory \!
     exit 1
fi

if [ ! -d $2 ]
then echo $2 is not a directory \!
     exit 1
fi 

4 个答案:

答案 0 :(得分:1)

给学生留下调试:

die () { echo >&2 "$*"; echo "Usage...."; exit 1; }
from="$1";
to="$2";
[ ."$from" = . ] && die "from dir name missing";
[ ."$to" = . ] && die "to dir name missing";
[ -d "$from" ] || die "from dir $from not a directory";
[ -d "$to" ] || die "to dir $to not a directory";
target="$to/$(basname "$from")";  #final target dir name, if I understand you correctly.
find "$from" -name '*.txt' -maxdepth=1 | cpio -pd "$to" ||
# (cd "$from" && find * -name '*.txt' -maxdepth=1 | cpio -o...) | ( cd "$to" && cpio -i...) ||
   die "cpio failed"

请注意cpio有很多选项,您应该在使用它之前查看它们。

注释掉的技术可让您更自由地移动到备用目标目录,我认为您不需要这些目录。

避免悲伤:始终引用文件名。

答案 1 :(得分:0)

只需在脚本上添加:

    cp -dR $2 $1

答案 2 :(得分:0)

您可能有更好的机会使用rsync

例如:

rsync -avz /dir1/ /dir2

答案 3 :(得分:0)

根据您对文件属性保护的偏好,cptarrsync周围存在许多单行替代方案。可以使用find命令获取过滤。