형식의 파일 이름을 가진 파일 디렉터리가 있습니다 <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
.sort
natural sort of (version) numbers within text
man 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
이제 보관해야 할 파일 목록과 나머지 파일은 삭제해야 합니다.