zsh globbing - 중복된 파일 이름 문자열이 있는 파일 찾기

zsh globbing - 중복된 파일 이름 문자열이 있는 파일 찾기

형식의 파일 이름을 가진 파일 디렉터리가 있습니다 <num1>v<num2>.txt. 중복된 파일을 모두 찾고 싶습니다 <num1>. 중복된 항목이 발견되면 더 작은 항목을 삭제해야 합니다 <num2>.

가능합니까? 이를 처리하기 위해 Python 스크립트를 쉽게 작성할 수 있지만 내장된 zsh 기능을 위한 좋은 응용 프로그램이 될 수 있다고 생각했습니다.

다음 파일 목록에서 처음 세 파일에는 중복된 <num1>부분이 있습니다. 마찬가지로 네 번째와 다섯 번째도 중복됩니다.

012345v1.txt
012345v2.txt
012345v3.txt
3333v4.txt
3333v7.txt
11111v11.txt

다음 내용을 포함하는 디렉터리로 만들고 싶습니다.

012345v3.txt
3333v7.txt
11111v11.txt

답변1

다음을 수행할 수 있습니다.

files=(<->v<->.txt(n))
typeset -A h
for f ($files) h[${f%%v*}]=$f
keep=($h)
echo rm ${files:|keep}

echo(만족스러우면 삭제)

  • <->: 임의의 숫자 시퀀스( <x-y>지정된 범위가 없는 전역 연산자)
  • (n):숫자 정렬
  • ${f%%v*}:Standard/ksh 욕심 모드가 끝에서 제거되었습니다.
  • ${files:|keep}: 배열 빼기.

답변2

저는 쉘에 익숙하지 않습니다 zsh. 다음 awk명령 조합을 사용하여 처음 찾은 파일을 정렬했습니다 find.sortnatural sort of (version) numbers within textman sort설명하다.

awk그런 다음 정의를 전달 -F'v'하고 파일 이름의 첫 번째 반복 부분을 기반으로 배열에 추가합니다(이렇게 하면 마지막 항목이 배열에 유지됩니다). 따라서 제가 말하는 명령은 다음과 같습니다.큰 V 기호가 있는 파일:

awk -F'v' '{U[$1]=$1"v"$2}END{for(x in U)print U[x]}' <(find . -type f|sort -V)
./012345v3.txt
./3333v7.txt
./11111v11.txt

이제 보관해야 할 파일 목록과 나머지 파일은 삭제해야 합니다.

관련 정보