저는 Linux 셸(바람직하게는 bash)에서 파일 이름의 처음 몇 글자를 기반으로 파일의 중복을 찾는 방법을 찾고 있습니다.
이것이 유용한 경우:
마인크래프트용 모드팩을 제작하고 있습니다. 1.14.4부터 Forge는 이후 패키지에 중복 모드가 있어도 더 이상 오류가 발생하지 않습니다. 가장 오래된 버전의 실행이 중지됩니다. 이러한 중복 항목을 찾는 데 도움이 되는 스크립트는 매우 유용합니다.
목록 예:
minecolonies-0.13.312-beta-universal.jar
minecolonies-0.13.386-alpha-universal.jar
사기를 당한 사람을 신속하게 식별함으로써 고객 기반을 더 작게 유지할 수 있습니다.
요청 시 추가 정보 제공
특정한 형식은 없습니다. 그러나 보시다시피 적어도 두 가지 인기 있는 형식이 있습니다. 게다가 커뮤니티에는 어떤 캐릭터를 사용할지, 사용하지 않을지에 대한 표준이 없습니다. 일부는 공백(더 역겨움)을 사용하고, 일부는 [](또한 역겨움)을 사용하고, 일부는 _(더 역겨움)을 사용하고, 일부는 -(선호되지만 무엇을 할 수 있는지)를 사용합니다.
https://gist.github.com/be3cc9a77150194476b2000cb8ee16e5샘플 모드 파일 이름 목록입니다. 깨끗이 청소되어 있어서 찢어진 물건은 하나도 없습니다.
https://gist.github.com/b0ac1e03145e893e880da45cf08ebd7a제가 의도적으로 복사한 샘플이 포함되어 있습니다. 이것은 때때로 일어나는 과장된 일입니다.
좀 더 자세한 설명
나는 이것이 자원 집약적일 수 있다는 것을 알고 있습니다.
샘플링할 모든 파일 이름의 시작부터 끝까지 슬라이스 범위를 임의로 지정하고 싶습니다. 해당 조각을 기반으로 중복 항목을 찾은 다음 중복 항목을 강조 표시합니다. 실제로 삭제하는 데 스크립트가 필요하지 않습니다.
추가 크레딧
스크립트는 쉽게 삭제하거나 이름을 바꿀 수 있도록 복사 기준을 충족하는 것으로 의심되는 파일에 대한 메뉴를 표시합니다.
답변1
중복 가능성 필터링
일부 스크립트를 사용하여 중복 가능성이 있는 파일을 필터링할 수 있습니다. 이름의 첫 번째 대시, 밑줄 또는 공백 앞에 있는 하나 이상의 다른 파일과 일치하는 모든 파일(대소문자 구분 안 함)을 새 디렉터리로 이동할 수 있습니다. cd
jars 디렉토리로 이동하여 실행하세요.
#!/bin/bash
mkdir -p possible_dups
awk -F'[-_ ]' '
NR==FNR {seen[tolower($1)]++; next}
seen[tolower($1)] > 1
' <(printf "%s\n" *.jar) <(printf "%s\n" *.jar) |\
xargs -r -d'\n' mv -t possible_dups/ --
참고: 가능한 중복 항목을 찾을 수 없을 때 파일 인수 없이 한 번 실행되는 것을 -r
방지하기 위한 GNU 확장입니다 . mv
또한 GNU 인수는 -d'\n'
파일 이름을 줄 바꿈으로 구분합니다. 즉, 위 명령에서 공백 및 기타 일반 문자는 처리되지만 줄 바꿈은 처리되지 않습니다.
필드 구분 기호 할당을 편집 -F'[-_ ]'
하여 문자를 추가하거나 제거하여 반복을 테스트하는 섹션의 끝을 정의할 수 있습니다. 이제는 "돌진, 풀기 또는 공백"을 의미합니다. 일반적으로 말해서, 여기서 했던 것처럼 반복되는 사례에 대해 실제보다 더 많은 데이터를 캡처하는 것이 좋습니다.
이제 이러한 파일을 확인할 수 있습니다. 파일 개수가 그리 많지 않다고 생각되면 필터링 없이 모든 파일에 대해 바로 다음 단계를 수행할 수도 있습니다.
중복 가능성에 대한 육안 검사
이 작업에는 시각적 셸을 사용하는 것이 좋습니다 mc
.자정 사령관. mc
Linux 배포판의 패키지 관리 도구를 사용하여 쉽게 설치할 수 있습니다 .
mc
이러한 파일이 포함된 디렉터리를 호출하거나 해당 디렉터리로 이동할 수 있습니다 . X 터미널을 사용하면 마우스도 지원되지만 모든 작업에 편리한 바로 가기가 있습니다.
예를 들어, 메뉴를 따르면 Left -> Sorting... -> untick "case sensitive"
원하는 정렬된 보기가 제공됩니다.
화살표를 사용하여 파일을 찾아보고 여러 파일을 선택한 Insert다음 강조 표시된 선택 항목을 복사( F5), 이동( F6) 또는 삭제( F8)할 수 있습니다. 다음은 필터링된 테스트 데이터의 스크린샷입니다.
답변2
우리에겐 해결책이 있어요 MC나 Ranger와 같은 쉘 관리자를 사용하지 않고도 bash 드라이버라는 목표를 쉽게 달성할 수 있으므로 이 답변을 수락했습니다.
#!/bin/bash
declare -a names
xIFS="${IFS}"
IFS="^M"
while true; do
awk -F'[-_ ]' '
NR==FNR {seen[tolower($1)]++; next}
seen[tolower($1)] > 1
' <(printf "%s\n" *.jar) <(printf "%s\n" *.jar) > tmp.dat
IDX=0
names=()
readarray names < tmp.dat
size=${#names[@]}
clear
printf '\nPossible Dupes\n'
for (( i=0; i<${size}; i++)); do
printf '%s\t%s' ${i} ${names[i]}
done
printf '\nWhich dupe would you like to delete?\nEnter # to delete or q to quit\n'
read n
if [ $n == 'q' ]; then
exit
fi
if [ $n -lt 0 ] || [ $n -gt $size ]; then
read -p "Invalid Option: present [ENTER] to try again" dummyvar
continue
fi
#clean the carriage return \n from the name
IFS='^M'
read -ra TARGET <<< "${names[$n]}"
unset IFS
# now remove the filename sans any carriage returns
# from the filesystem
# 12/18/2020
rm "${TARGET[*]}"
echo "removed ${TARGET[0]}" >> rm.log
done
IFS="${xIFS}"
결과에 만족할 때까지 중복 및 루프를 찾기 위해 수백 개의 파일 이름을 읽을 필요가 없기 때문에 이것은 나에게 잘 작동합니다. 또한 내 작업을 로그 파일에 저장합니다.
일반적으로 중복 모드는 거의 발생하지 않지만, 중복된 모드가 발생하면 문제가 됩니다. 이 스크립트는 내 상황을 크게 개선했습니다.
스크립트를 더욱 지능적이고 사용자 친화적으로 만들 수 있다면 꼭 보고 싶습니다.
편집자: 2020년 11월 5일
- 내 마음을 바꿨다
- 이 스크립트를 며칠 동안 사용해왔는데 매우 유용했습니다.
- 내가 할 수 있는 일은 클라이언트 패키지를 업그레이드한 다음 클라이언트 모드를 제외한 모든 항목을 서버에 업로드한 다음 이 스크립트를 사용하여 서버 모드/폴더를 빠르게 정리하는 것입니다. 이제 패키지 유지 관리가 더 빨라졌습니다!
- IFS를 사용하고 메뉴에서 출력을 정리하도록 스크립트가 업데이트되었습니다.
수정 날짜: 2020년 12월 18일
- 약간만 변경하면 더 많은 상황에서 스크립트가 올바르게 작동할 수 있습니다.