2011-11-04 22 views
0

如果我有兩個文件集合:A和B(比如兩個照片集合)。兩個集合之間存在重疊(集合A中的一些照片也存在於集合B中 - 可能具有不同的文件名),但是在(可能)不同的目錄結構中。此外,集合A中的文件可能在集合B中的多個位置出現多次,反之亦然(儘管文件名可能不同)。集合A中的所有文件是否在不同結構化的集合B中佔有?

我該怎麼知道,我可以安全地刪除集合A(即集合A中的所有文件至少在集合B中的某處存在一次)?

此外,它是關於文件內容,而不是文件名。

  • diff和衍生物不幫我,因爲他們抱怨的集合A和B.

  • fdupes之間的不同的文件結構(http://linux.die.net/man/1/ fdupes)(它比較文件大小和MD5簽名,然後執行逐字節檢查驗證)是一個方便的工具,用於檢查雙打,但有一個令人討厭的習慣,即如果從哪個集合中刪除雙重文件是不可預知的。 「手動」選項耗時很長。

fdupes也似乎是錯誤的工具。我只需要知道,如果在一個集合中的所有文件集B中佔從兩個集合

+0

您是否在http://en.wikipedia.org/wiki/Fdupes頁面找不到您喜歡的內容? – Mat

回答

1

首先製作MD5SUM文件

find CollectionA -type f -print0 | xargs -0 md5sum -b > CollectionA.MD5SUM 
    find CollectionB -type f -print0 | xargs -0 md5sum -b > CollectionB.MD5SUM 

在此之後,你會發現所有的CollectionB

(while read MD5SUM FILENAME; do grep -qis $MD5SUM CollectionB.MD5SUM || echo $FILENAME does not exist in CollectionB; done)<CollectionA.MD5SUM 
丟失的文件

更多conveniant

(while read MD5SUM FILENAME; do grep -qis $MD5SUM CollectionB.MD5SUM || echo ${FILENAME#\*} does not exist in CollectionB; done)<CollectionA.MD5SUM 

剝去*從beginni ng的文件名。

您必須知道,此解決方案相當慢。

+0

也許在一半並且運行兩個線程(假設你至少有兩個內核)切割'CollectionB'會加快這個解決方案的速度。是否有可能在Bash中「分配處理器」? – Werner

+0

如果你想拆分這個,你會拆分'CollectionA',以得到正確的結果,因爲我們匹配A到B中的每個條目。我沒有試圖將一個腳本或對應的進程分配給一個核心。 – f4m8

+0

** GNU parallel ** to rescue: 'parallel --eta -a CollectionA.MD5SUM --colsep'\ s'「grep -iq {1} CollectionB.MD5SUM || echo {2}」' – Werner

相關問題