2011-11-10 5 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 

많은 감사를 md5sum이를 사용하여 더 나은 접근 방식 triplee하기!

이전 버전 :

#!/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 

이 "에코"제거를 공장.

관련 문제