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
  • 警告

  • 该脚本不处理名称空间中的文件/目录,这需要额外的处理,但现在你有一个好的开始
  • 链接地址: http://www.djcxy.com/p/78323.html

    上一篇: Bash script that copies the differences in two directories to a third directory?

    下一篇: Using grep in Python to search for exact words only