파일 이름이 약간 다른 중복 파일 찾기

파일 이름이 약간 다른 중복 파일 찾기

bash 스크립트나 명령을 사용하여 대괄호 내에서만 다르지만 매우 유사한 이름을 가진 파일을 찾고 싶습니다. 예를 들어

Filename (year1)
Filename (year2)

일치해야합니다.

아니면 좀 더 구체적으로 말하면,

Filename (2000)
Filename (2001)

일치해야합니다.

답변1

다음 스크립트는 위치 인수 목록을 패턴과 일치하는 이름 목록 *' ('*')', 즉 이름에 공백이 있고 끝에 괄호가 있는 현재 디렉터리의 모든 파일로 설정하여 작동합니다.

스크립트는 이중 루프를 사용하여 각 이름을 다른 모든 이름과 비교합니다. A이름을 다른 이름과 비교한 B다음 과 비교 B하는 것을 피하기 위해 A외부 반복이 시작될 때 목록의 첫 번째 요소를 이동합니다. 이는 또한 A이름 자체에 대한 테스트를 방지합니다.

내부 루프에서는 이름 끝의 대괄호를 제거하고 두 결과 문자열을 비교합니다. 문자열이 동일하면 이름을 인쇄합니다.

#!/bin/sh

set -- *' ('*')'

for name do
        shift

        for dup do
                if [ "${name%% (*)}" = "${dup%% (*)}" ]; then
                        printf '"%s" <-> "%s"\n' "$name" "$dup"
                fi
        done
done

답변2

늦었지만 Gawk를 사용하여 파일 이름을 처리하는 작은 Bash 스크립트를 작성해야겠다고 생각했습니다. 특정 디렉터리에 있는 파일 간의 다양한 스푸핑에 플래그를 지정합니다. 파일 쌍을 한 번만 확인하더라도 처리는 여전히 O(n^2)입니다.

관심 있는 디렉터리(예: 다음을 포함하는 디렉터리)에서 스크립트를 실행합니다.

$ \ls -A -1
2323- (1236).suffix
23232(1234).suffix
23232 (1236).hsj
23232 (1236).suffix
hello(2001.10.29)fgh.ssh
hello(2002.10.29)fgh.ssh
23232(1236).suffix
23232(12 6).suffix
23232 (1286).suffix
23232 (1446).suffix
23232(3236).suffix
dwlkl(1234).sds

현재 스크립트:

$ cat near_match.sh
#!/usr/bin/env bash
gawk '
    {i++; a[i] = $0; next}  # put files to check in array 'a'
    END {
        nfiles = i; # number of files to check
        for (i = 1; i <= nfiles-1; i++) {
            lblkarr1 = split(a[i], blkarr1, "[()]");
            lparr1 = split(blkarr1[2], parr1, "");
            for (j = i+1; j <= nfiles; j++) {
                lblkarr2 = split(a[j], blkarr2, "[()]");
                lparr2 = split(blkarr2[2], parr2, "");
                mismatch = 0;
                if ("x"blkarr1[1]"x" == "x"blkarr2[1]"x" && "x"blkarr1[3]"x" == "x"blkarr2[3]"x" && lparr1 == lparr2) {
                    for (k=1; k<=length(blkarr1[2]); k++) { if (parr1[k] != parr2[k]) mismatch++ };
                    if (mismatch == 1)  printf "dupes: %s  <-->  %s\n", a[i], a[j];
                }
            }
        }
    }' <<< $(\ls -A -1 -- *"("*")"*)

exit 0

스크립트를 실행 가능하게 만들고 인수 없이 실행합니다.

$ near_match.sh
dupes: 23232(1234).suffix  <-->  23232(1236).suffix
dupes: 23232 (1236).suffix  <-->  23232 (1286).suffix
dupes: hello(2001.10.29)fgh.ssh  <-->  hello(2002.10.29)fgh.ssh
dupes: 23232(1236).suffix  <-->  23232(12 6).suffix
dupes: 23232(1236).suffix  <-->  23232(3236).suffix
  • OP가 지정한 대로 "dupe"는 대괄호 안의 1문자 불일치로 구체적으로 정의됩니다. 파일 이름의 어느 곳에서나 문자 불일치를 감지할 수 있도록 솔루션을 확장하여 솔루션을 조정하는 것은 쉽지 않습니다.
  • 대괄호는 파일 이름의 어느 위치에나 배치할 수 있으며 파일 이름에는 접미사가 있거나 없을 수 있습니다.
  • 제안된 솔루션은 파일 이름의 특수 문자(추가 대괄호 제외)에 강력한 것으로 보입니다.
  • 최소한의 변경으로 한 문자 불일치를 다중 문자 불일치로 변경할 수 있습니다. 스크립트에 매개변수를 입력하여 이 숫자를 변경하는 것은 간단합니다. 필요한지 물어보십시오.

화타이

관련 정보