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

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

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

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

おすすめ記事