2011-11-10 51 views
0

我從網站下載了大量文件(〜10,000),其中大部分是大量無用的HTML,它們都表達了相同的內容。然而,這個乾草堆中有一些文件具有有用的信息(因此是相當不同的文件),我需要一種快速的方法將其與其他文件分開。我知道我可以逐個瀏覽所有文件,並使用cmp與模板進行比較,看看它們是否相同,然後刪除它們。但是,這很慢。有沒有更快的方法來做到這一點?我不介意我是否只有99%的恢復率。快速比較Bash中的大量文件

+0

要明確:要刪除其內容的所有文件匹配指定的模板文件? –

+0

你可以做的是在你的問題更具體。你的意思是大多數文件是相同的,即內容從頭到尾匹配字節的字節?或者乾脆他們是相似的?當你說某些文件是「非常不同的文件」時,你是什麼意思?他們的內容有所不同?文件類型?尺寸?還有別的嗎? –

+0

是的,我想刪除匹配的文件,它們都是完全一樣的字節字節。不同的文件有額外的信息,因此會更大,但會是相同的文件類型。 –

回答

1

這其中列出了獨特的文件作爲參數傳遞的樹:

#!/bin/bash 
declare -A uniques 
while IFS= read -r file; do 
    [[ ! "${uniques[${file%% *}]}" ]] && uniques[${file%% *}]="${file##* }" 
done< <(find "$1" -type f -exec md5sum -b "{}" \;) 

for file in ${uniques[@]}; do 
    echo "$file" 
done 

非常感謝triplee使用的md5sum更好的方法!

一版本:

#!/bin/bash 
declare -a files uniques 

while IFS= read -r -d $'\0' file; do 
    files[${#files[@]}]="$file" 
done< <(find "$1" -type f -print0) 

uniques=(${files[@]}) 
for file in "${files[@]}"; do 
    for unique in "${!uniques[@]}"; do 
     [[ "$file" != "${uniques[$unique]}" ]] && cmp -s "$file" "${uniques[$unique]}" && && unset -v uniques[$unique] 
    done 
done 

for unique in "${uniques[@]}"; do 
    echo "$unique" 
done 
+1

這將執行大量的冗餘比較。在文件上運行'md5sum'並選擇唯一的。 – tripleee

+0

@triplee:你說得對,那要好得多。我會更新代碼 – ata

0

假設所有文件都在或當前目錄下,並且模板是在父目錄和文件名都沒有空格:

find . -type f -print | while read -r filename; do 
    if ! cmp --quiet $filename ../template; then 
    echo rm $filename 
    fi 
done 

刪除「回聲」,如果你不滿意這個作品。