因此,我需要编写一个Unix Bourne Shell来将名为dir1和dir2的目录中的所有文件复制到名为dir3的新目录中。
该脚本首先将所有文件从dir1复制到dir3中。
然后,脚本根据以下条件将每个文件从dir2复制到dir3条件:如果dir2中的文件尚未存在于dir3中,或者如果dir2文件比同一个dir3文件新,它将覆盖dir3中与其同名的文件。
这些应该是输出:
These files from dir1 copied into dir3:
a.c b.c file1.c
These new file(s) from dir2 copied into dir3:
file2.c
These file(s) from dir2 copied into dir3 and overwrite(s) their
namesakes in dir3:
a.c
$ ls
cp2.sh dir1 dir2 dir3
$ ls -l dir1
total 12
-rw-r--r-- 1 sxu staff 9 Aug 2 12:52 a.c
-rw-r--r-- 1 sxu staff 9 Aug 2 12:52 b.c
-rw-r--r-- 1 sxu staff 9 Aug 2 12:52 file1.c
$ ls -l dir2
total 12
-rw-r--r-- 1 sxu staff 9 Aug 2 12:53 a.c
-rw-r--r-- 1 sxu staff 9 Aug 2 12:51 b.c
-rw-r--r-- 1 sxu staff 9 Aug 2 12:53 file2.c
$ ls -l dir3
total 16
-rw-r--r-- 1 sxu staff 9 Aug 2 12:53 a.c
-rw-r--r-- 1 sxu staff 9 Aug 2 12:52 b.c
-rw-r--r-- 1 sxu staff 9 Aug 2 12:52 file1.c
-rw-r--r-- 1 sxu staff 9 Aug 2 12:53 file2.c
因此,从技术上讲,因为dir2 a.c的创建时间比dir1 a.c1分钟,所以它被粘贴到dir3中,覆盖之前粘贴的dir1 a.c
这不适用于dir2 b.c,因为它早于dir1 b.c建。
然而,我的输出是这样的:
These files from dir1 copied into dir3:
a.c b.c file1.c
These new file(s) from dir2 copied into dir3:
file2.c
These file(s) from dir2 copied into dir3 and overwrite(s) their
namesakes in dir3:
a.c
b.c
这是我的代码:
#!/bin/sh
#Test for directory existence
test -d $1
if [ $? -eq 1 ]
then
echo "'$1' directory does not exist."
exit 0
elif
test -d $2
[ $? -eq 1 ]
then
echo "'$2' directory does not exist."
exit 0
elif
test -d $3
[ $? -eq 0 ]
then
echo "'$3' directory does not exist."
exit 0
fi
#create dir3
mkdir $3
#output for users
echo "These new file(s) from $1 copied into $3:"
ls $1
ls $1 | while read file
do
cp $1/$file $3/$file
done
echo "These new file(s) from $2 copied into $3:"
ls $2 | while read file
do
test -f $3/$file
if [ $? -eq 1 ]
then
echo "$file"
fi
done
echo "These file(s) from $2 copied into $3 and overwrite(s) their namesakes in $3:"
ls $2 | while read file
do
test -f $3/$file
if [ $? -eq 0 ]
then
cp -u $2/$file $3/$file
echo "$file"
else
cp $2/$file $3/$file
fi
done
我想这些部分是错误的,但无法找出问题所在。。。
echo "These file(s) from $2 copied into $3 and overwrite(s) their namesakes in $3:"
ls $2 | while read file
do
test -f $3/$file
if [ $? -eq 0 ]
then
cp -u $2/$file $3/$file
echo "$file"
else
cp $2/$file $3/$file
fi
done
提前非常感谢。非常感谢
循环时不要使用一系列elif
s。只有在一切正常时才返回0
的退出代码,而不是在出现问题时:
for d in "$1" "$2" ; do
test -d "$d" ||
{ echo "'$d' directory does not exist."
exit 1 ; }
done
如果目标目录存在,mkdir
已经返回错误,因此不需要编写冗余代码。这就足够了:
mkdir "$3" || exit
除了对用户的输出之外,实际上并不需要文件副本while
循环。只需将cp
与-u
或--update
以及-v
或--verbose
开关一起使用;详见man cp
。两个while
环路可以一起缩减为一条线路:
cp -uv "$1"/* "$2"/* "$3"