fdupes - 比较两个目录后删除文件

Chr*_*fic 6 shell-script rm files fdupes

我目前正在尝试使用fdupes. 我想相互比较两个文件夹,然后删除这些目录之一中的所有重复文件。

例子:

文件被自动存储在/srv/- 那里有很多重复项。他们都将保持原样。我也有一个名为的目录/watchfolder/watchfolder如果它们存在于/srv/.

我试过fdupes -r srv/ watchfolder/,反之亦然。但它一直在搞乱我的文件srv/

Cod*_*ome 5

使用 Fdupes 递归时进行过滤

如果您有多个重复项,那么您最终可能会得到如下结果:

srv/foo                               
srv/a/b/foo
watchfolder/foo
watchfolder/c/foo
watchfolder/d/foo
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您需要将重复项列表输入到过滤器或 shell 脚本中以应用一些更智能的规则,除非您只想保留找到的第一个重复项(例如 srv 中嵌套深度最少的匹配项)。如果这就是您想要的,那么:

fdupes --recurse --delete srv/ watchfolder/
Run Code Online (Sandbox Code Playgroud)

会工作。对于更复杂的情况,例如想要保留 srv/ 中的所有内容,请考虑使用如下过滤器:

fdupes --recurse srv/ watchfolder/ | sed '/^srv/d; /^$/! s/.*/"&"/' | xargs rm
Run Code Online (Sandbox Code Playgroud)

  • 我不认为最后一个例子是一个好的做法。如果 _watchfolder/_ 包含文件的重复项,而该副本未包含在 _srv/_ 中,则会导致数据丢失。请小心并在执行此操作之前进行备份。 (2认同)

Bri*_*Guy 3

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
Run Code Online (Sandbox Code Playgroud)

  • 当“bar”和“foo”交换时,这个(好)答案的一个很好的补充就是:“$fdupes bar/ foo/”。因为,与您可能想象的不同,输出可能与“$fdupes foo/ bar/”中的输出非常相同,因为正如您正确指出的那样,时间戳是它唯一关心的事情。如果您无论如何都想保持一个文件夹不变,这可能会让您彻底发疯。由于 fdupes 只能保护第一个文件(自上而下),因此顺序很重要。无论如何,我认为任何涉及“grep”或“sed”的方法对于一个设计糟糕的工具来说都是丑陋的解决方法。 (2认同)