1

我需要制作一个有 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

4 回答 4

1

把调试留给学生:

die () { echo >&2 "$*"; echo "用法...."; 1号出口;}
来自="$1";
to="$2";
[ ."$来自" = . ] && die "从目录名丢失";
[ ."$to" = . ] && die "目录名丢失";
[ -d "$from" ] || die "from dir $from not a directory";
[ -d "$to" ] || die "to dir $to not a directory";
target="$to/$(basname "$from")"; #final 目标目录名称,如果我理解正确的话。
find "$from" -name '*.txt' -maxdepth=1 | cpio -pd "$to" ||
# (cd "$from" && find * -name '*.txt' -maxdepth=1 | cpio -o...) | ( cd "$to" && cpio -i...) ||
   死“cpio失败”

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

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

避免悲伤:总是引用文件名。

于 2013-03-28T10:43:49.070 回答
0

只需将其附加到脚本的 and 中:

    cp -dR $2 $1
于 2013-03-28T10:24:40.070 回答
0

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

例如:

rsync -avz /dir1/ /dir2
于 2013-03-28T10:24:46.540 回答
0

cp根据您对保存文件属性的偏好,在tar或周围存在许多单行替代方案rsync。可以使用该find命令进行过滤。

于 2013-03-28T10:24:48.600 回答