又一个文件去重工具
项目描述
又一个文件去重工具。
关于
有哪些使用场景?
- 我从云端下载了照片和视频。哦,谷歌照片和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的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 06ad8abe9328fcaaf05c02ef53c4390eb1966716e4bb1a889cc414e26d4c5f32 |
|
MD5 | a2015344339727f2bb29586207f0aa93 |
|
BLAKE2b-256 | 0cff8d7513e9d4774ab476c4413e9ffd4677b54a4dc8df2a4ec6ebd552c01d76 |