Bash脚本将两个目录中的差异复制到第三个目录中?
我想要做的是比较两个目录d1和d2,并将d1和d2中都不存在的所有文件复制到第三个目录d3。
我知道我可以使用这个复制两个目录中的所有文件:
cp -vfudp dir1 / * dir3 /
cp -vfudp dir2 / * dir3 /
但我知道我需要包含find函数并进行比较。 或差异。 我可以使用吗?
rsync -a dir1 / dir2 /
以某种方式创建第三个目录,并把差异?
我想我需要使用
diff -r --brief dir1 dir2
也在那里。 我是一个新手程序员,也是新手,所以对函数的解释将非常感谢。
d1="/tmp/d1"
d2="/tmp/d2"
d3="/tmp/d3"
cd "${d1}"
for file in * ; do
if [ ! -f "${d2}/${file}" ] ; then
cp "${file}" "${d3}"
fi
done
cd -
cd "${d2}"
for file in * ; do
if [ ! -f "${d1}/${file}" ] ; then
cp "${file}" "${d3}"
fi
done
cd -
for file in $(diff dir1 dir2 | sed 's/Only in ([^ ]*): /1//'); do
cp "$file" dir3/
done
diff dir1 dir2
为您提供两个目录中不存在的文件列表:
$ diff dir1 dir2
> Only in dir2: f3
> Only in dir1: f4
> Only in dir2: f5
我们通过sed管道获取文件的路径(也许diff
有一个选项可以做到这一点,我们不需要sed:
$ diff dir1 dir2 | sed 's/Only in ([^ ]*): /1//'
> dir2/f3
> dir1/f4
> dir2/f5
然后我们遍历这个文件列表并将它们复制到dir3
。
小心子目录! (你有什么?)
让我们仔细看看sed命令:
sed 's/Only in ([^ ]*): /1//'
s
是替代命令,如果你想用true代替true,你可以使用s/true/false/
。 我们只想Only in ([^ ]*):
替换Only in ([^ ]*):
。 第一部分只是diff
命令的输出文本,然后我们使用转义括号(
和)
来匹配文件的名称,以便以后再次引用(使用1
)。 在括号内,我们有[^ ]*
,它匹配除空格以外的所有内容(所以这里我们假设文件名没有空格,这可以改进!)。 这匹配目录的名称。 然后我们匹配diff
命令的更多文本,即:
。 所有这些都被替换为1
,这只是(
和)
(目录名称)
内的部分。 我们最终得到有关文件的完整路径。
使用awk和diff的单线解决方案
LANG=C diff -aqr /tmp/d1 /tmp/d2 |
awk -F'[ :]' '/^Only in/{system("cp -a "$3"/"$NF " /tmp/d3/")}'
说明
LANG=C
力差异输出为英文,用于错误解析 diff -aqr /tmp/d1 /tmp/d2
将递归地显示与两个dirs丢失或不同的文件 awk
来剪切目录/文件名 -F'[ :]'
表示:在空格上拆分列和:
is like a
grep`,如果找到了模式,我们执行: system("cp -a "$3"/"$NF " /tmp/d3/")
:复制/ tmp / d3中的found_dir / found_file 警告
上一篇: Bash script that copies the differences in two directories to a third directory?