有没有比 fdupes -rdN 更精细的删除重复项的方法?

ixt*_*lix 24 disk-usage files fdupes

最近我需要删除很多重复项。我正在合并三个或四个文件系统,我希望能够经济地使用空间。起初,fdupes它似乎是这项工作的最佳工具,但我越来越遇到限制。

考虑命令fdupes -rdN somedirectory/。这会对 somedirectory 的子目录中的所有文件进行散列。

当它遇到重复项时,它会删除它们,因此所有内容都只有一个副本。

但是如果我想保留somedirectory/subdirectory1/somefile并且实际上有四个重复项,并且程序首先遇到其中一个重复项怎么办?然后它删除了somedirectory/subdirectory1/somefile我不想要的。

我希望能够以某种方式指定要保留的重复项。到目前为止,处理重复项的标准程序(duff、FSLint)似乎都不允许这种行为的自动化。我不想自己动手,所以这就是我问这个问题的原因。

我希望能够写出类似的东西

killdupes -rdN --keep=filesin,somedirectories,separated,by,commas somedirectory/
Run Code Online (Sandbox Code Playgroud)

Jod*_*hon 8

虽然您寻求的功能在库存中不可用fdupes,但我进行了分叉fdupes (我的分叉称为jdupes并添加了一些可以在某些情况下解决此问题的功能。例如,在上述情况下,您希望somedirectory/subdirectory1/somefile在自动删除重复项(dN开关一起)并且下面没有单独的文件时保留somedirectoryjdupes可以使用subdirectory1first 和-O开关(按命令对文件进行排序)为每个直接子目录路径提供-line 参数顺序优先):

jdupes -nrdNO somedirectory/subdirectory1 somedirectory/subdirectory2 somedirectory/subdirectory3

这将自动删除重复集中除一个文件外的所有文件,并保证如果该集中包含一个文件,somedirectory/subdirectory1它将是第一个,从而自动成为该集中保留的文件。这种方法仍然存在明显的限制,例如somedirectory/subdirectory1可能会保留另一个副本而不是您想要保留的副本,但在很多像您这样的情况下,jdupes参数顺序选项作为一种解决方法就足够了。

在不久的将来,我计划添加一个过滤系统jdupes,以便-N在全局或每个参数的基础上对文件的包含/排除、操作的保留以及此类“过滤器堆栈”的应用进行大量控制。非常需要这个功能;我设想这样的事情“递归地自动删除非零重复但始终保持somedirectory/subdirectory1/somefile原样”:

jdupes -nrdN --filter=preserve:somedirectory/subdirectory1/somefile somedirectory/


小智 5

我在其他任何地方都没有看到这个:说你想要的是这个。你有 /mnt/folder-tree-1 /mnt/folder-tree-2。您不想删除每个重复项,但是如果 tree-2 中存在一个文件,并且 tree-1 中存在具有完全相同路径和名称的相同文件,请将其从 tree-2 中删除。

警告:这非常简洁,如果您尝试使用有限的 shell 技能复制粘贴它,请小心。

fdupes -rn /mnt/folder-tree-1/ /mnt/folder-tree-2/ > dupes-all.txt

fgrep /mnt/folder-tree-1/ dupes-all.txt | while read line
do
if grep -q "`echo $line | sed -e 's|^/mnt/folder-tree-1/|/mnt/folder-tree-2/|'`" dupes-all.txt
then
    echo rm \"$(echo $line | sed -e 's|^/mnt/folder-tree-1/|/mnt/folder-tree-2//|')\"
fi
done > rm-v2-dupes.sh
Run Code Online (Sandbox Code Playgroud)

或者全部在一行上:

fdupes -rn /mnt/folder-tree-1/ /mnt/folder-tree-2/ > dupes-all.txt; fgrep /mnt/folder-tree-1/ dupes-all.txt | while read line; do if grep -q "`echo $line | sed -e 's|^/mnt/folder-tree-1/|/mnt/folder-tree-2/|'`" dupes-all.txt; then echo rm \"$(echo $line | sed -e 's|^/mnt/folder-tree-1/|/mnt/folder-tree-2/|')\"; fi; done > rm-v2-dupes.sh
Run Code Online (Sandbox Code Playgroud)

之后,检查并执行 rm-v2-dupes.sh


Iva*_*mov 2

用于sed创建一个 shell 文件,其中包含注释掉的命令来删除每个重复文件:

fdupes -r -n -S /directory | sed -r "s/^/#rm \"/" | sed -r "s/$/\"/" >remove-duplicate-files.sh
Run Code Online (Sandbox Code Playgroud)

我们刚刚创建的结果remove-duplicate-files.sh文件将注释掉每一行。取消注释要删除的文件。然后跑sh remove-duplicate-files.sh。瞧!

更新

好吧,如果您不想只删除某些目录中的文件,那就这么简单

fdupes -S /directory|sed '/^$/d' |sed -r "s/^[0-9]/#&/" > duple_list

python exclude_duplicates.py -f /path/to/dupe_list --delimiter='#' --keep=/full/path/to/protected/directory1,/full/path/to/protected/directory2\ with\ spaces\ in\ path >remove-duplicate-files-keep-protected.sh
Run Code Online (Sandbox Code Playgroud)

哪里exclude_duplicates.py

fdupes -r -n -S /directory | sed -r "s/^/#rm \"/" | sed -r "s/$/\"/" >remove-duplicate-files.sh
Run Code Online (Sandbox Code Playgroud)

我们刚刚创建的结果remove-duplicate-files-keep-protected.sh文件将注释掉受保护目录中的所有文件。在您喜欢的文本编辑器中打开此文件,检查一切是否正常。然后运行它。瞧(原文如此)!