我试图找到一种方法,在给定的目录中检查重复的文件(即使有不同的名称),并将它们替换为指向第一次出现的符号链接。我试过使用fdupes,但它只是列出了那些副本。
这就是背景:我正在根据我的喜好定制一个图标主题,我发现许多图标,即使它们在父文件夹中有不同的名称和位置,并且被用于不同的目的,基本上都是相同的图片。由于使用同样的修改二三十次是多余的,而只有一个是真正需要的,我只想保留一个图像,并将所有其他的图像和符号连接起来。
例如,如果我在目录fdupes -r ./中运行testdir,它可能会返回以下结果:
./file1.png
./file2.png
./subdir1/anotherfile.png
./subdir1/subdir2/yetanotherfile.png考虑到这个输出,我希望只保留文件file1.png,删除所有其他文件,并将它们替换为指向它的符号链接,同时维护所有原始文件名。因此,file2.png将保留其名称,但将成为指向file1.png的链接,而不是复制。
这些链接不应指向绝对路径,而应相对于父testdir目录;也就是说,yetanotherfile.png将指向../../file1.png,而不是/home/testuser/.icons/testdir/file1.png。
我对涉及GUI和CLI的解决方案都感兴趣。使用fdupes并不是强制性的,我引用过它,因为我知道它是一个工具,但是我对使用其他工具的解决方案很开放。
我非常肯定,处理所有这些问题的bash脚本应该不会那么难创建,但我还不够专业,无法自己找到如何编写。
发布于 2018-03-05 21:51:10
如果您不太喜欢编写脚本,那么我可以推荐rdfind。它将扫描给定目录中的重复文件,并用硬链接或符号链接替换它们。我用它来整理我的Ruby宝石目录,并取得了很大的成功。它可以在Debian/Ubuntu中使用。
发布于 2016-08-19 19:12:06
我也遇到过类似的情况,但在我的例子中,符号链接应该指向相对路径,所以我编写了这个python脚本来完成这个任务:
#!/usr/bin/env python
# Reads fdupes(-r -1) output and create relative symbolic links for each duplicate
# usage: fdupes -r1 . | ./lndupes.py
import os
from os.path import dirname, relpath, basename, join
import sys
lines = sys.stdin.readlines()
for line in lines:
files = line.strip().split(' ')
first = files[0]
print "First: %s "% first
for dup in files[1:]:
rel = os.path.relpath(dirname(first), dirname(dup))
print "Linking duplicate: %s to %s" % (dup, join(rel,basename(first)))
os.unlink(dup)
os.symlink(join(rel,basename(first)), dup)对于每个输入行(这是一个文件列表),脚本拆分文件列表(分隔空格),获取从每个文件到第一个文件的相对路径,然后创建符号链接。
https://unix.stackexchange.com/questions/155548
复制相似问题