최신 버전을 제외한 모든 버전 삭제 - 타임스탬프 없음

최신 버전을 제외한 모든 버전 삭제 - 타임스탬프 없음

다음과 같은 파일이 많이 있습니다.

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 --

관련 정보