查找重複文件並用符號連結替換它們
我試圖找到一種方法來檢查給定目錄中的重複文件(即使名稱不同),並將它們替換為指向第一次出現的符號連結。我試過了,
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)
對於每個輸入行(文件列表),腳本拆分文件列表(空格分隔),獲取每個文件到第一個文件的相對路徑,然後創建符號連結。