Symlink

查找重複文件並用符號連結替換它們

  • June 30, 2020

我試圖找到一種方法來檢查給定目錄中的重複文件(即使名稱不同),並將它們替換為指向第一次出現的符號連結。我試過了,fdupes但它只列出了那些重複項。

這就是上下文:我正在根據自己的喜好自定義圖示主題,並且我發現許多圖示,即使它們在父文件夾中具有不同的名稱和不同的位置,並且用於不同的目的,基本上都是一樣的圖片。由於在真正需要一個時應用相同的修改二十或三十次是多餘的,我想只保留一個圖像並符號連結所有其他圖像。

例如,如果我fdupes -r ./在目錄中執行testdir,它可能會返回給我以下結果:

./file1.png
./file2.png
./subdir1/anotherfile.png
./subdir1/subdir2/yetanotherfile.png

鑑於此輸出,我想只保留 file file1.png,刪除所有其他文件並用指向它的符號連結替換它們,同時保留所有原始文件名。因此file2.png將保留其名稱,但將成為連結file1.png而不是重複。

這些連結不應指向絕對路徑,而應相對於父testdir目錄;即將yetanotherfile.png指向../../file1.png,而不是指向/home/testuser/.icons/testdir/file1.png

我對涉及 GUI 和 CLI 的解決方案都感興趣。我引用它不是強制性的fdupes,因為它是我知道的工具,但我也對使用其他工具的解決方案持開放態度。

我很確定處理所有這些的 bash 腳本應該不難創建,但我不夠專業,無法自己找出如何編寫它。

如果您不喜歡太多腳本,那麼我可以推薦rdfind。它將掃描給定目錄中的重複文件,並用硬連結或符號連結替換它們。我已經使用它對我的 Ruby gems 目錄進行了重複數據刪除,並取得了巨大的成功。它在 Debian/Ubuntu 中可用。

我有類似的情況,但在我的情況下,符號連結應該指向一個相對路徑,所以我編寫了這個 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