linux - 如何更正从 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
提前非常感谢。非常感激
解决方案
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
or -u
, --update
and -v
or--verbose
开关;详情见man cp
。两个while
循环可以一起简化为一行:
cp -uv "$1"/* "$2"/* "$3"
推荐阅读
- android - 如何改善android webview中的滚动?
- html - 如何使用 HTML 和 CSS 在同一个进度条上添加多个圆圈?
- php - 使用 array_map 函数将数组中的每个值相乘
- python - 用于多元时间序列的 Keras 递归神经网络
- css - 使 SVG 在移动设备中可滚动
- excel - Excel 公式/VBA 仅显示另一张工作表的一列的一部分
- ios - 如何为 XCUIElement 添加扩展?
- ruby-on-rails - 搜索踢铁轨 5
- vaadin - vaadin 10 - 推送 - 标签不会更新
- git - 使用 git mv 并避免致命的源/目标错误