跳转到主要内容

又一个文件去重工具

项目描述

Build Status

又一个文件去重工具。

关于

有哪些使用场景?

  • 我从云端下载了照片和视频。哦,谷歌照片和YouTube都缩小了文件并改变了格式。此外,它们还将文件名缩短到47个字符,并将扩展名改为大写。那么我该如何知道我已经全部离线备份了呢?
  • 我的硬盘上杂乱无章地堆满了几个备份,我想确保这些都是副本。
  • 我从多个来源合并数据。备份中的一些文件可能具有我可能希望恢复的原始文件修改日期。

比较什么?

  • 文件名。

当文件保持大致相同的名称时,效果很好。(从谷歌下载的照片的根名称被缩短到47个字符,但这足够了。)可能忽略大小写。

  • 文件日期。

您可以强制相同的文件mtime,容忍几个小时(以纠正时区混乱),或者完全忽略日期。

  • 文件大小、图像哈希或视频帧数。

文件必须具有相同的大小。或者利用底层的媒体魔法,它忽略文件大小,但比较图像或视频内容。当文件被转换为不同的格式时,这非常好。

  • 内容?

您可以使用checksum=True执行CRC32检查。然而,对于字节对字节的检查,当文件名可能不同或您需要检查是否存在字节损坏时,其他工具可能更好,例如jdupes

为什么不使用像meld这样的标准同步工具?

这些意味着文件夹具有相同的结构。deduplidog对散布在周围的文件具有容错性。

疑问?

程序不会写入任何内容到磁盘,除非设置了execute=True。您可以随意启动它以检查推荐的操作。或者设置bashify=True以输出您可能启动的bash命令,在仔细检查后。

启动

它作为一个具有CLI和TUI界面的独立程序工作。只需启动deduplidog命令。此外,当从Jupyter Notebook导入时,它效果最佳。

示例

让我们仔细看看一个用例。

import logging
from deduplidog import Deduplidog

Deduplidog("/home/user/duplicates", "/media/disk/origs", ignore_date=True, rename=True)
Find files by size, ignoring: date, crc32
Duplicates from the work dir at 'home' would be (if execute were True) renamed (prefixed with ✓).
Number of originals: 38
* /home/user/duplicates/foo.txt
  /media/disk/origs/foo.txt
  🔨home: renamable
  📄media: DATE WARNING + a day
Affectable: 38/38
Affected size: 59.9 kB
Warnings: 1

我们发现duplicates文件夹中的所有文件似乎都无用,只有一个文件。它的日期早于原始文件。请查看完整日志。

Deduplidog("/home/user/duplicates", "/media/disk/origs", ignore_date=True, rename=True, set_both_to_older_date=True, logging_level=logging.INFO)
Find files by size, ignoring: date, crc32
Duplicates from the work dir at 'home' would be (if execute were True) renamed (prefixed with ✓).
Original file mtime date might be set backwards to the duplicate file.
Number of originals: 38
* /home/user/duplicates/foo.txt
  /media/disk/origs/foo.txt
  🔨home: renamable
  📄media: redatable 2022-04-28 16:58:56 -> 2020-04-26 16:58:00
* /home/user/duplicates/bar.txt
  /media/disk/origs/bar.txt
  🔨home: renamable
* /home/user/duplicates/third.txt
  /media/disk/origs/third.txt
  🔨home: renamable
  ...
Affectable: 38/38
Affected size: 59.9 kB

您可以看到,日志是最简洁的,但也是最透明的。受工作文件夹影响的文件前会加上 🔨 图标,而受原始文件夹影响的文件则使用 📄 图标。我们可以添加execute=True参数来执行操作。或者使用bashify=True来检查。

Deduplidog("/home/user/duplicates", "/media/disk/origs", ignore_date=True, rename=True, set_both_to_older_date=True, bashify=True)

bashify=True仅生成我们可能使用的命令。

touch -t 1524754680.0 /media/disk/origs/foo.txt
mv -n /home/user/duplicates/foo.txt /home/user/duplicates/✓foo.txt
mv -n /home/user/duplicates/bar.txt /home/user/duplicates/✓bar.txt
mv -n /home/user/duplicates/third.txt /home/user/duplicates/✓third.txt

文档

参数

导入Deduplidog类并更改其参数。

from deduplidog import Deduplidog

或者通过启动deduplidog从CLI或TUI更改这些参数。

查找重复项。通常,文件必须具有相同的大小、日期和名称。(如果设置了如strip_end_counter之类的参数,名称可能只是相似。)如果media_magic=True,媒体文件将遵循不同的规则:不比较大小或日期。请参阅其帮助信息。

参数 类型 默认值 描述
work_dir str | Path - 文件可能存在重复的文件夹。
original_dir str | Path - 原始文件所在的文件夹。通常,这些文件不会受到影响。
(然而,它们可能受到treat_bigger_as_original或set_both_to_older_date的影响。)
操作
execute bool False 如果为False,则不会发生任何操作,仅执行安全运行。
bashify bool False 打印与如果execute为True将执行的操作相对应的bash命令。
您可以自行检查和运行它们。
affect_only_if_smaller bool False 如果media_magic=True,所有写作操作如rename、replace_with_original、set_both_to_older_date和treat_bigger_as_original
仅在可影响的文件小于另一个文件时执行。
rename bool False 如果execute=True,则在重复工作文件名前添加 ✓(或者如果treat_bigger_as_original,则可能是在原始文件名前)。
与replace_with_original和delete互斥。
delete bool False 如果execute=True,则删除重复的工作文件名(或者如果treat_bigger_as_original,则可能删除原始文件名)。
与replace_with_original和rename互斥。
replace_with_original bool False 如果execute=True,则用原始文件替换重复的工作文件(或者如果treat_bigger_as_original,则反之亦然)。
与rename和delete互斥。
set_both_to_older_date bool False 如果execute=True、media_magic=True或(media_magic=False且ignore_date=True),则将两个文件都设置为较旧的日期。例如,工作文件获取原始文件的日期或反之亦然。
treat_bigger_as_original bool False 如果execute=True、rename=True且media_magic=True,则如果原始文件小于工作文件,则原始文件可能会受到影响(通过重命名)。
匹配
casefold bool False 不区分大小写的文件名比较。
checksum bool False 如果media_magic=False且ignore_size=False,则通过CRC32校验和比较文件。(此模式相对较慢。)
(此模式相对较慢。)
tolerate_hour int | tuple[int, int] | bool False 当比较work_dir中的文件且media_magic=False时,容忍小时差异。
有时在处理FS更改时,文件可能会偏移几小时。
* bool → -1 .. +1
* int → -int .. +int
* tuple → int1 .. int2
示例:tolerate_hour=2 → work_file.st_mtime -7200 ... + 7200 与 original_file.st_mtime 进行比较
ignore_date bool False 如果 media_magic=False,文件将不按日期比较。
ignore_size bool False 如果 media_magic=False,文件将不按大小比较。
space2char bool | str False 在比较 work_dir 中的文件时,将空格视为另一个字符。例如:“file 012.jpg”比较为“file_012.jpg”
strip_end_counter bool False 在比较 work_dir 中的文件时,去除计数器。例如:“00034(3).MTS”比较为“00034.MTS”
strip_suffix str False 在比较 work_dir 中的文件时,去除与正则表达式匹配的文件名末尾。例如:“001-edited.jpg”比较为“001.jpg”
work_file_stem_shortened int None 从 Google 下载的相片,其基本名缩短为 47 个字符。为了比较目的,将原始文件夹的文件名也缩短。
媒体
media_magic bool False 对于具有媒体后缀的文件,不比较大小或日期。
如果视频具有相同的名称和相似帧数,则视为重复,即使扩展名不同。
如果图像具有相同的名称和相似的图像哈希值,则视为重复,即使文件大小不同。
(此模式相对较慢。)
accepted_frame_delta int 1 仅在 media_magic 为 True 时使用
accepted_img_hash_diff int 1 仅在 media_magic 为 True 时使用
img_compare_date bool False 如果为 True 且 media_magic=True,则文件日期或 EXIF 日期必须匹配。

实用工具

deduplidog.utils 包中,你可以找到一些漂亮的工具来帮助你。你可以通过使用你的 IDE 提示来找到参数。

images

urls: Iterable[str | Path] 显示图像条带。

print_video_thumbs

src: str | Path 显示视频的缩略图。

print_videos_thumbs

dir_: Path 为了快速了解每个视频的内容,输出持续时间以及前几个帧。

get_frame_count

filename: str|Path 使用 cv2 确定视频帧数。方法被缓存。

search_for_media_wizzard

cwd: str 在指定的路径中反复提示并搜索具有相似名称的文件。显示所有此类文件作为图像和视频预览。

are_contained

work_dir: str, original_dir: str, sec_range: int = 60 你有两个目录,其中包含具有不同命名系统的文件(427.JPG 与 DSC_1344),你怀疑它们包含相同的集合。这两个目录中的相同文件似乎具有相同的时间戳。相同的时间戳表示 +/- sec_range(例如:1 分钟)。循环所有 work_dir 中的文件,并显示具有相同时间戳的相应文件,或警告不存在原始文件。

remove_prefix_in_workdir

work_dir: str 从所有文件中递归地移除前缀 ✓。该前缀可能是 deduplidog 之前提供的。

mark_symlink_by_target

suspicious_directory: str | Path, starting_path: str 如果文件是符号链接,指向此路径,则使用箭头重命名它。

:param suspicious_directory: Ex: /media/user/disk/Takeout/Photos/
:param starting_path: Ex: /media/user/disk

mark_symlink_only_dirs

dir_: str | Path 如果目录中充满了符号链接或为空,则将其重命名为箭头。

mtime_files_in_dir_according_to_json

dir_: str | Path, json_dir: str | Path Google Photos 返回包含照片修改时间的 JSON。将 dir_ 中的照片设置为从这些 JSON 中检索的日期。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解更多关于 安装包 的信息。

源分发

本版本不可用源代码分发文件。请参阅有关生成分发存档的教程。

构建的分发

deduplidog-0.6.1-py3-none-any.whl (19.5 kB 查看散列值)

上传时间 Python 3

由以下支持