我目前正在尝试使用 解决问题fdupes
。我想相互比较两个文件夹,然后删除这些目录之一中的所有重复文件。
例子:
文件被自动存储在/srv/
其中——有很多重复项。他们都应保持原样。我还有一个名为的目录/watchfolder/
,我想删除其中的所有文件(watchfolder
如果它们存在于/srv/
.
我试过了fdupes -r srv/ watchfolder/
,反之亦然。但它一直弄乱我的文件srv/
。
答案1
使用 Fdupes 递归时进行过滤
如果您有多个重复项,那么您最终可能会得到如下结果:
srv/foo
srv/a/b/foo
watchfolder/foo
watchfolder/c/foo
watchfolder/d/foo
在这种情况下,您需要将重复项列表输入到过滤器或 shell 脚本中以应用一些更智能的规则,除非您只想保留找到的第一个重复项(例如 srv 中嵌套深度最少的匹配项)。如果这就是您想要的,那么:
fdupes --recurse --delete srv/ watchfolder/
会工作。对于更复杂的情况,例如想要保留 srv/ 中的所有内容,请考虑使用如下过滤器:
fdupes --recurse srv/ watchfolder/ | sed '/^srv/d; /^$/! s/.*/"&"/' | xargs rm
答案2
fdupes 将保留第一个文件,即具有最早时间戳的文件。帮助中的说明有点误导。
$ ll foo/ bar/
bar/:
total 12
-rw-rw-r--. 1 BriGuy BriGuy 2 Jul 23 16:10 a
-rw-rw-r--. 1 BriGuy BriGuy 102 Jul 23 16:22 b
-rw-rw-r--. 1 BriGuy BriGuy 610 Jul 23 16:23 c
foo/:
total 12
-rw-rw-r--. 1 BriGuy BriGuy 2 Jul 23 16:10 a
-rw-rw-r--. 1 BriGuy BriGuy 102 Jul 23 16:11 b
-rw-rw-r--. 1 BriGuy BriGuy 610 Jul 23 16:22 c
$ fdupes foo/ bar/
foo/b
bar/b
foo/c
bar/c
# in above foo/b and foo/c would be kept
$ cp bar/c foo/c
$ fdupes foo/ bar/
bar/c
foo/c
foo/b
bar/b
# in above foo/b and bar/c would be kept,
# as bar/c has an earlier timestamp than foo/c now