remdups-删除重复文件
remdups的Python项目详细描述
Author: | Roland Puntaier |
---|---|
Homepage: | https://github.com/rpuntaie/remdups |
License: | See LICENSE file |
重复记录
remdups生成一个脚本
- 删除重复文件
- 将文件从另一个目录复制到此目录,忽略重复项
- 将文件从另一个目录移动到此目录,忽略重复项
在shell中执行之前,应该进一步检查生成的脚本。
用法
可选。您可以选择一个或多个源+哈希方法,例如:
cat > .remdups_c.sha512 cat > .remdups_e.md5
所有。remdups{c,b,d,e,n}.{sha512,sha384,sha256,sha224,sha1,md5} 参与最后的散列。如果不生成这样的文件,则默认为:
.remdups_c.sha256
{ C′:“内容”、“b”:“块”、“d”:“日期”、“e”:“ExIF”、“n”:“名称”}/P>
通过以下任一方法创建哈希文件(可能需要很长时间):
remdups remdups update remdups update <fromdir>
散列将添加到all.remdups_x.y。以重新散列所有文件:
rm .remdups_*
使用rm、mv、cp命令制作脚本。 它可以用不同的选项重复,直到脚本好为止。
$remdups rm-s脚本.sh $remdups cp-s script.bat如果使用<;fromdir>; $remdups mv-s script.py如果使用<;fromdir>;
如果文件以.sh结尾,则使用cp,文件名为linux格式。 这也适用于带有msys、msys2和cygwin的windows。
如果文件以.bat结尾,则使用windows命令。
如果文件以.py结尾,则使用python函数。
检查脚本,必要时返回到2.。 对脚本的更改也可以通过编辑器完成。
执行脚本
$./script.sh
或者,您可以从自己的python脚本中使用remdup,或者从python提示符中交互使用remdup。
安装
- 直接从PYPI获得:
$ pip install remdups
- 从github:clone,切换到目录并执行
$ python setup.py install
如果您计划扩展此工具
- 叉子在github
- 从叉子克隆到PC
- 执行可编辑安装
$ pip install -e .
- 更改后测试,覆盖率达到100%
$ py.test --cov remdups.py --cov-report term-missing
- 考虑共享对其他人有用的更改(github拉取请求)。
提示
对于更高级的文件选择,可以使用find。 以下示例忽略目录old,并为所有JPEG文件生成哈希:
$ find . -path "old" -prune -or -not -type d -and -iname "\*.jpg" -exec sha256sum {}\; > .remdups_c.sha256
命令行
除了提供的帮助之外,还提供了以下帮助:
remdups --help
散列的源可以是:
{'c': 'content', 'b': 'block', 'd': 'date', 'e': 'exif', 'n': 'name'}
不要包含n,因为找不到具有不同名称的相同文件。c是最好的。
例如:
cat > .remdups_b.sha512 cat > .remdups_c.sha256
从当前目录中填充哈希文件:
remdups update
或者从另一个目录填充哈希文件:
remdups update <fromdir>
在后一种情况下,哈希文件中的路径将具有//或\\ 在随后的mv或cp命令中标记新亲属路径的开始。
填充哈希文件后,创建脚本。这取决于使用的扩展名:
remdups <command> -s script.sh <options> remdups <command> -s script.bat <options> remdups <command> -s script.py <options>
command可以是rm,cp,mv。 还有dupsof和dupsoftail,但它们不接受--script,而是打印输出。
--keep-in、--keep-out和--comment-out将删除重复组的不同文件。 --safe将在创建脚本之前进行逐字节比较。这需要更长的时间。
cp和mv也采用--sort:在这种情况下,不会重新创建树,但会对文件进行排序 使用文件修改日期提供的树结构。见https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior。
API
使用您自己的python脚本,您可以加载用于散列的文件并使用 立即加载内容以创建新文件(如果不重复)。
fromremdupsimport*hasher=Hasher()allduplicates=[]forfilename,duplicates,contentinhasher.foreachcontent('.'):ifduplicates:allduplicates.append(f)else:assertcontent!=[]#some .remdups_ must be with (c)ontentnfilename='afilehere'withopen(nfilename,'wb')asnf:forbufincontent:nf.write(buf)shutil.copystat(filename,nfilename)
foreachcontent()使用scandir(),但不向.remdup_文件添加重复的文件。
^{公关1七}$如果不想保留内容,请不要为scandir中的content提供[]。 scandir()将散列.remdup_文件中尚未包含的所有文件,并返回文件名。
此代码通过散列和创建副本(如果不重复)来引用树。
importosimportremdupsos.chdir('dir/to/resort/to')withopen('.remdups_c.sha256','w'):passremdups.resort('../some/dir/here',"%y%m/%d_%H%M%S")