문제가 있는데 최선의 해결책을 찾는 방법을 모르겠습니다. 다음과 같은 파일 목록이 있습니다.
file1\0file2\0...fileX\0\0file(x+1)\0
\0
각 파일 이름은 각 파일 그룹에 대한 추가 구분 기호로 구분됩니다 \0
. 모든 그룹의 모든 파일은 동일한 해시 코드를 갖습니다(저는 이를 계산하기 위해 md5sum을 사용합니다). 각 그룹의 어떤 파일이 동일한지 찾아서 인쇄해야 합니다.
예를 들어, 6개의 파일 세트가 있습니다(f1, f2, f3, f4, f5, f6이라고 부르겠습니다). 나는 diff를 사용하여 f1,f2,f3이 동일하고 f4,f5도 동일하다는 것을 발견했습니다(그러나 f1,f2,f3과는 다릅니다). 그래서 f1, f2, f3 및 f4, f5 파일을 인쇄하고 싶지만 f6은 인쇄하지 않으려고 합니다(f6의 중복 항목을 찾을 수 없기 때문입니다).
나는 | while read -r -d $'\0' file
데이터를 읽는 데 사용합니다. 제가 가장 좋은 방법을 찾도록 도와주실 수 있나요?
편집: 내 질문을 단순화합니다. n개의 필드가 있는 배열이 있습니다. 나는 가장 느린 알고리즘이 아닌 bash에서 구현하기 쉬운 알고리즘을 찾고 있습니다. 이 알고리즘은 동일한 값을 찾고 해당 값 끝에 숫자를 추가하여 나중에 정렬하는 데 도움이 됩니다. 내 예를 참조하면, "정렬" 후에 "f1 1", "f2 1", "f3 1", "f4 2", "f5 2", "f6 3"을 인쇄하고 awk를 사용하여 수정하고 싶습니다. 테이블.
답변1
MD5를 사용해야 하고 입력 파일에 해시 충돌이 있다고 가정할 때(다른 바이너리 파일에는 MD5 이상이 있음) 해싱할 때 무작위 SALT(짧은 무작위 문자열)를 사용하여 충돌이 발생하도록 할 수 있습니다. 체크섬이 다시 변경됩니다.
예를 들어
#!/bin/bash
SALT=$(dd if=/dev/urandom status=none bs=1c count=128)
FILES=("f1" "f2" "f3" "f4" "f5");
for file in "${FILES[@]}"
do
echo $(echo $SALT | cat - "$file" | md5sum --binary | cut -d' ' -f1) $file
done
그러면 각 파일의 MD5 해시가 계산됩니다.문서, 무작위로 생성된 128바이트를 추가합니다.소금혼합되어 다음과 같은 출력이 생성됩니다.
741eefc6c14d80ee38164a0961cfd200 f1
741eefc6c14d80ee38164a0961cfd200 f2
741eefc6c14d80ee38164a0961cfd200 f3
68441eb38393a75dee94ae089d528633 f4
68441eb38393a75dee94ae089d528633 f5
이 명령을 다시 실행하면 다른 체크섬을 얻게 됩니다(예:소금다양하지만 여전히 중복 파일과 일치합니다.
bc2fdca1b765989b62e507711749c5b4 f1
bc2fdca1b765989b62e507711749c5b4 f2
bc2fdca1b765989b62e507711749c5b4 f3
a31019a6ace1f51b18920bb33d781c97 f4
a31019a6ace1f51b18920bb33d781c97 f5
이제 이 "MD5SUM 파일" 목록을 처리하여 중복 목록을 얻을 수 있습니다.
또한 여러 \0\0 구분 그룹, \0 구분 파일 이름과 같은 형식으로 입력 데이터를 처리하도록 이를 조정해야 합니다. (숙제의 모든 재미를 없애지 않고).