最新バージョンを除くすべてのバージョンを削除する - タイムスタンプなし

最新バージョンを除くすべてのバージョンを削除する - タイムスタンプなし

次のファイルがたくさんあります。

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並べ替えられたソフトウェアツール1行: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(またはまたはzshkshと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 --

関連情報