다음과 같은 파일이 많이 있습니다.
Some Name da-1234567-1.py
Some Name da-1234567-2.py
Some Name da-1234567-4.py
Other Name di-5678912-3.py
Other Name di-5678912-4.py
Other Name di-5678912-5.py
모든 버전을 제거하고 다음 버전만 유지하고 싶습니다.
Some Name da-1234567-4.py
Other Name di-5678912-5.py
내 문제가 다음과 비슷하다는 것을 깨달았습니다.최신 폴더/파일 버전 찾기 및 삭제 - 타임스탬프 데이터 없음. 그러나 그 대답은 나에게 효과가 없었고 내 필요에 맞게 솔루션을 변경할 만큼 bash 및/또는 정규식에 대해 충분히 알지 못합니다. 안타깝게도 댓글을 남길 평판 점수가 없어서 새로운 질문을 올리는 것 외에는 다른 선택이 없습니다.
위의 질문에서 다음을 시도했습니다.
for file in *.*
do
[[ -d "$file" || $file =~ _[[:digit:]]{3}\. ]] && continue
echo -n "Considering $file: " >&2
extn="${file/*.}"
versions=("$file")
keep="$file"
# Look at matching files
for version in "${file%.$extn}"_???."$extn"
do
[[ -f "$version" ]] || continue
# Save every one. Identify the current last
versions+=("$version")
keep="$version"
echo -n "$version " >&2
done
echo "==> keep $keep" >&2
# Delete them all except the last
for version in "${versions[@]}"
do
[[ "$version" != "$keep" ]] && echo rm -f -- "$version"
done
[[ "$keep" != "$file" ]] && echo mv -f -- "$keep" "$file"
done
이 부분에 문제가 있을 수 있다는 것을 깨달았습니다.
$file =~ _[[:digit:]]{3}\.
위의 질문과 달리 내 파일이 _nnn 대신 -n으로 끝나지만 어떻게 수정해야 할지 모르겠습니다.
답변1
버전 번호별로 사용 ls -v
및 정렬된 소프트웨어 도구 한 줄 :sort -V
{ ls -Qrv *.py |rev | uniq -f 1 | rev; ls -Q *.py; } | sort -V | uniq -u | xargs rm
사용법은 uniq -f 1
일관된 파일 명명 형식에 따라 다릅니다. 마지막 필드를 무시할 수 있는 다른 방법이 없으므로 rev
주변 s가 필요합니다 .-f
답변2
그리고 zsh
:
# all *.<number>.py files in "n"umerical order
files=(*-<->.py(n))
# associative array whose key is the part before the last "-"
typeset -A latest
for f ($files) latest[${f%-*}]=$f
# plain array with the values of the associative array
keep=($latest)
# array subtraction:
echo rm -- ${files:|keep}
( 만족스러우면 삭제하세요 echo
).
이는 파일 이름의 나머지 부분에 어떤 문자가 포함될 수 있는지에 대한 가정을 하지 않습니다. bash
(또는 zsh
또는 ksh
) 및 GNU 도구를 사용하십시오 .
xargs -r0a <(printf '%s\0' *-*.py |
grep -zEe '-[[:digit:]]+\.py$' |
sort -zrV |
awk -vRS='\0' -vORS='\0' '
{key = $0; sub(/-[^-]*$/, "", key)}
seen[key]++') echo rm --