如何解决我该如何纠正从Unix Bourne Shell中的目录打印出复制文件的问题?
因此,我需要编写一个Unix Bourne Shell来将所有文件从名为dir1和dir2的目录复制到名为dir3的新目录中。
该脚本首先将所有文件从dir1复制到dir3。
然后脚本将每个文件从dir2复制到dir3,但要遵守这些规则 条件:如果dir3中没有dir2中的文件,或者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 ac 比 dir1 ac 晚1分钟,因此它被粘贴到 dir3 中,从而覆盖了先前粘贴的 dir1 ac 。
这不适用于 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
。仅在一切正常时返回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"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。