首页 > 解决方案 > 如何更正从 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 ac的创建时间比dir1 ac晚 1 分钟,所以它被粘贴到dir3中,覆盖了之前粘贴的dir1 ac

这不适用于dir2 bc因为它是在dir1 bc之前创建的。

但是,我的输出是这样的:

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

提前非常感谢。非常感激

标签: linuxshellunixscriptingsh

解决方案


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循环并不是真正需要的。只需使用cpor -u, --updateand -vor--verbose 开关;详情见man cp。两个while循环可以一起简化为一行:

cp -uv "$1"/* "$2"/* "$3"

推荐阅读