两个文件夹之间的linux公共文件

Mar*_*ian 4 linux

您好,我有 2 个目录,它们都包含目录树和文件树。如果可能,我需要一个脚本来验证目录之间的公共文件,如果他找到一个公共文件,我需要在 DIR2 中将其删除并链接到 DIR1。

例子:

  • DIR1 包含目录 abc1 、 abc2 、 abc3 并且 abc1 包含文件 a.txt
  • DIR2 包含目录 abc1 、 abc4, abc4 包含文件 a.txt
  • 脚本应删除 DIR2/abc4 中的 a.txt 并建立指向 DIR1/abc/a.txt 的链接

该脚本最好使用 bash、awk、sed 或 perl。

谢谢!

示例文件结构:

$ mkdir -- DIR1/ DIR1/abc1/ DIR1/abc2/ DIR1/abc3/ DIR2/ DIR2/abc1/ DIR2/abc4/
?

$ touch -- DIR1/abc3/a.txt DIR2/abc4/a.txt
?

$ tree
.
??? DIR1
?   ??? abc1
?   ??? abc2
?   ??? abc3
?       ??? a.txt
??? DIR2
    ??? abc1
    ??? abc4
        ??? a.txt

7 directories, 2 files
?
Run Code Online (Sandbox Code Playgroud)

Mar*_*iae 6

没有理由编写脚本文件,有一些命令可以在没有脚本的情况下执行此操作。

该命令diff显示差异:

 diff -r dir1/ dir2/ 
Run Code Online (Sandbox Code Playgroud)

( -r= 递归比较找到的任何子目录,请参阅手册) 将打印位于任一目录中的文件列表。

如果您还想检查同名文件的内容是否也相同,那么您应该使用

diff --brief -r dir1/ dir2/
Run Code Online (Sandbox Code Playgroud)

( --brief= 仅输出文件是否不同)。

如果您还想查看仅存在于一个目录中的文件的差异,将其对应项视为空,您可以使用

diff --brief -Nr dir1/ dir2/
Run Code Online (Sandbox Code Playgroud)

( -N= 将不存在的文件视为空文件)。

如果要进行操作,命令

cp -Rnl dir1/ dir2/
Run Code Online (Sandbox Code Playgroud)

会为你做的。请注意-R= 递归复制目录(再次来自手册),而-n= 不会覆盖现有文件。


use*_*874 0

您应该能够在 bash 中轻松完成此操作。您正在寻找进行比较的命令是md5sumor diff

例如,下面的脚本仅比较命令行上指定的两个文件的 md5sum:

#!/bin/bash

FILE_A="$1"
FILE_B="$2"

if [ "`md5sum $FILE_A | awk '{print $1}'`" == "`md5sum $FILE_B | awk '{print $1}'`" ] ; then
    echo "Same File"
else
    echo "Files Differ"
fi
Run Code Online (Sandbox Code Playgroud)

要遍历目录树,您需要使用递归。这是我很久以前编写的一个示例脚本,用于重命名文件名中带有空格的所有文件,以使用下划线而不是空格。

#!/bin/bash

rename 's/\ /_/g' ./*
currentdir=`pwd`

### for all files and directories in the current directory.
for filename in `ls` ; do
    ### if "filename" is a directory but not a softlink
    if [ -d $filename ] && ! [ -h $filename ] ; then
        cd "$filename"
        $0 ### This causes the script to call itself. Recursion!
        cd "$currentdir"
    fi
done
Run Code Online (Sandbox Code Playgroud)

然后,要在目录之间创建文件链接,请使用ln -s dir1/File1 dir2/.