如何更正从Unix Bourne Shell中的目录打印复制文件的错误



因此,我需要编写一个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

提前非常感谢。非常感谢

循环时不要使用一系列elifs。只有在一切正常时才返回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"

最新更新