我如何在两个目录中搜索具有相同名称、大小、类型的文件...并将它们从这些目录之一中删除?
答案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您可以运行(检查后)来删除重复项。