实际上我正在尝试做两件不同的事情......
首先是复制所有视频文件、照片和文档(复制到我的旅行硬盘上),不包括任何重复项。所以我的旅行硬盘上只有一份副本。这必须能够查看多个级别的文件夹(ntfs 文件系统)。第二件事是传输所有这些文件的一份副本,同时从源中删除任何重复项,在源中保留一份原始文件,在旅行驱动器中保留副本。这是针对两个不同的系统,这就是为什么两个相似的请求
我希望能够将其限制为任何特定的文件类型(通过编码比较或 .xyz 扩展名),并确保对文件进行哈希检查是否重复。
我的需求是将重复文件查找功能与自动传输/复制到另一媒体上结合起来......最好是一步完成。
有这样的工具吗?或者我将如何使用命令行来执行此操作?
答案1
一种想法是使用fdupes
和的组合rsync
。
- 使用 为考虑传输的所有文件创建暂存区域
rsync
。 - 删除除暂存区域中的重复项之外的所有重复项(仅)。
- 再次使用 . 将暂存中的剩余文件传输到目的地
rsync
。
为此,我们需要三个位置:
- 原始文件, 中的目录路径
$origdir
。 - 暂存区,
$stagingdir
. - 目标,. 中的本地或远程路径
$destdir
。
首先,创建暂存区域(这假设暂存区域尚不存在,或者如果存在,则它只包含应传输的内容):
rsync --archive --verbose --link-dest="$origdir" \
--include="*.jpg" --include="*/" --exclude="*" \
"$origdir/" "$stagingdir"
.jpg
这将通过从原始位置创建硬链接来将名称结尾的所有文件复制到暂存区域。仅需要创建目录结构的空间,并且文件数据不会重复(除非$stagingdir
和$origdir
位于两个不同的分区上)。要添加其他文件名模式,请添加更多--include
选项(前这--exclude
)。
然后跑fdupes
过去$stagingdir
:
fdupes --delete --recurse "$stagingdir"
这将在删除任何内容之前以交互方式要求您确认。还有一个--noprompt
选项可以在不确认的情况下删除文件。请阅读fdupes
手册小心。$origdir
从暂存区删除文件不会影响下面的文件,
然后从暂存目录中删除空目录(这是一个额外的步骤,只是稍微清理了一下):
find "$stagingdir" -type d -empty -delete -print
这将遍历整个暂存区域并删除任何空目录。成功删除后,将打印任何已删除的目录。
最后传输非重复项:
rsync --archive --verbose "$stagingdir/" "$destdir"
此过程将保留与第一个过程中使用的模式匹配的文件的原始目录结构,并且在删除重复项rsync
后仍保留在原处。fdupes