![](/img/trans.png)
[英]How to merge content from files with same name but in different folders by Python?
[英]Find files with same name but different content
我需要在包含大量文件的 linux 文件夾結構中查找名稱相同但內容不同的文件。
這樣的事情部分完成了工作,我如何消除具有不同內容的文件?
#!/bin/sh
dirname=/path/to/directory
find $dirname -type f | sed 's_.*/__' | sort| uniq -d|
while read fileName
do
find $dirname -type f | grep "$fileName"
done
非常感謝 !
第一個問題是,如何判斷兩個文件的內容是否相同?
一種明顯的可能性是讀取(或映射)兩個文件並一次比較一個塊。 在某些平台上, stat
比read
快得多,因此您可能需要先比較大小。 還有其他可能有用的優化,具體取決於您實際在做什么(例如,如果您要運行數千次,並且大多數文件每次都相同,您可以散列它們並緩存散列,並且僅在散列匹配時檢查實際文件)。 但是我懷疑如果您現有的代碼是可以接受的(因為它為樹中的每個文件搜索整個樹一次),您是否太擔心這種性能調整,所以讓我們做最簡單的事情。
這是在 Python 中執行此操作的一種方法:
#!/usr/bin/env python3
import sys
def readfile(path):
with open(path, 'rb') as f:
return f.read()
contents = [readfile(fname) for fname in sys.argv[1:]]
sys.exit(all(content == contents[0] for content in contents[1:]))
如果所有文件都相同,這將退出代碼 1,如果任何文件對不同,代碼 0 退出。 因此,將其保存為allequal.py
,使其可執行,並且您的 bash 代碼可以對該grep
的結果運行allequal.py
,並使用退出值(例如,通過$?
)來決定是否打印這些結果你。
我面臨與問題中描述的相同的問題。 在一個大的目錄樹中,一些文件具有相同的名稱和相同的內容或不同的內容。 內容不同的那些需要人工注意來決定如何在每種情況下解決這種情況。 我需要創建這些文件的列表來指導執行此操作的人員。
問題中的代碼和 abernet 響應中的代碼都很有幫助。 這是將兩者結合起來的方式:將 abernet 響應中的 python 代碼存儲在某個文件中,例如 /usr/local/bin/do_these_files_have_different_content:
sudo tee /usr/local/bin/do_these_files_have_different_content <<EOF
#!/usr/bin/env python3
import sys
def readfile(path):
with open(path, 'rb') as f:
return f.read()
contents = [readfile(fname) for fname in sys.argv[1:]]
sys.exit(all(content == contents[0] for content in contents[1:]))
EOF
sudo chmod a+x /usr/local/bin/do_these_files_have_different_content
然后擴展 Illusionist 問題中的 bash 代碼以在需要時調用該程序,並對其結果做出反應:
#!/bin/sh
dirname=$1
find $dirname -type f | sed 's_.*/__' | sort| uniq -d|
while read fileName
do
if do_these_files_have_different_content $(find $dirname -type f | grep "$fileName")
then find $dirname -type f | grep "$fileName"
echo
fi
done
這會將所有名稱相同但內容不同的文件的路徑寫入標准輸出。 名稱相同但內容不同的文件組用空行分隔。 我將 shell 腳本存儲在 /usr/local/bin/find_files_with_same_name_but_different_content 並將其調用為
find_files_with_same_name_but_different_content /path/to/my/storage/directory
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.