如何比较两个目录并删除重复文件

如何比较两个目录并删除重复文件

我如何在两个目录中搜索具有相同名称、大小、类型的文件...并将它们从这些目录之一中删除?

答案1

使用fdupes

fdupes --delete dir1 dir2

fdupes不会测试文件名或文件类型,但会测试文件大小和内容(隐式包括文件类型)。

例子:

$ mkdir dir1 dir2

$ touch dir{1,2}/{a,b,c}

$ tree
.
|-- dir1
|   |-- a
|   |-- b
|   `-- c
`-- dir2
    |-- a
    |-- b
    `-- c

2 directories, 6 files

$ fdupes --delete dir1 dir2
[1] dir1/a
[2] dir1/b
[3] dir1/c
[4] dir2/a
[5] dir2/b
[6] dir2/c

Set 1 of 1, preserve files [1 - 6, all]: 1

   [+] dir1/a
   [-] dir1/b
   [-] dir1/c
   [-] dir2/a
   [-] dir2/b
   [-] dir2/c

$ tree
.
|-- dir1
|   `-- a
`-- dir2

2 directories, 1 file

答案2

我以 2 个目录 p1 和 p2 为例

首先,我将 p1 和 p2 目录文件名的输出保存到 2 个输出文件

find /root/p1 -type f |awk -F "/" '{print $NF}'   > /var/tmp/P1_file.txt

 find /root/p2 -type f |awk -F "/" '{print $NF}'   > /var/tmp/P2_file.txt

现在我将在两个目录中找到通用文件名并在其中一个目录中删除。我希望你删除 /root/p1 中的重复文件并保留 /root/p2 中的文件

awk 'NR==FNR {a[$1];next}($1 in a) {print $1}' /var/tmp/P1_file.txt /var/tmp/P2_file.txt  |awk '{print "rm -rvf" " " "/root/p1/"$1}' | sh

测试并运行良好

答案3

我建议您使用dircmp许多 Unix 上都存在的命令。

看:

man dircmp

-d选项似乎是您可能认为最合适的选项:

dircmp -d dir1 dir2

将比较dir1和的内容dir2并显示diff类似的输出。

答案4

林特有选项可以执行此操作:

rmlint -T duplicates --match-basename --keep-all-tagged --must-match-tagged /duplicates // /originals

(“//”分隔符标识“标记”路径--保留所有标记--必须匹配标记开关)

找到重复项后,林特创建可执行脚本rmlint.sh您可以运行(检查后)来删除重复项。

相关内容