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문자 불일치로 구체적으로 정의됩니다. 파일 이름의 어느 곳에서나 문자 불일치를 감지할 수 있도록 솔루션을 확장하여 솔루션을 조정하는 것은 쉽지 않습니다.
- 대괄호는 파일 이름의 어느 위치에나 배치할 수 있으며 파일 이름에는 접미사가 있거나 없을 수 있습니다.
- 제안된 솔루션은 파일 이름의 특수 문자(추가 대괄호 제외)에 강력한 것으로 보입니다.
- 최소한의 변경으로 한 문자 불일치를 다중 문자 불일치로 변경할 수 있습니다. 스크립트에 매개변수를 입력하여 이 숫자를 변경하는 것은 간단합니다. 필요한지 물어보십시오.
화타이