Bashで名前にddmmyyタイムスタンプを持つファイルをソートする方法

Bashで名前にddmmyyタイムスタンプを持つファイルをソートする方法

「foo.date.bar」という形式の名前の一連のファイルがあります。ここで、「date」は6桁のフィールドです(例:310715)。

例えば

foo.310715.bar
foo.260815.bar
foo.110815.bar
foo.040815.bar

私のスクリプトがそれらのいくつかを削除できるように、ファイルメタデータではなくファイル名の日付に基づいて日付順にソートしたいと思います。一般的に、私はこれをPythonやPHPで簡単なので実行しますが、Bashで何をするかを学びたいと思います。初めてコマンドを試してみました。

for f in $( find $dir -type f | sort -r -t. -k 2 ); do
    echo $f
done

しかし、2番目の列を数字またはアルファベット順に並べ替えることは役に立たず、日付順に並べ替える必要があることに気づきました。sort6桁のフィールドを日付として処理する方法や、3つの2桁の列で処理する方法を知る方法がないようです。次のステップは、6桁のフィールドを解析可能なものに置き換えるのと同様のものをsed使用することです。trsort

助けてくれてありがとう。

MB


あなたの素晴らしい答えに感謝します。私はそれらから多くを学びました。

ベストアンサー1

これはbash配列の誤用です。タイムスタンプを分離し、YYMMDD順に配列エントリを作成し、配列を順番に印刷します。

declare -a array
for file in foo.*.bar
do
  [[ $file =~ foo.([[:digit:]]{2})([[:digit:]]{2})([[:digit:]]{2}).bar ]] && \
    {
      index="${BASH_REMATCH[3]}${BASH_REMATCH[2]}${BASH_REMATCH[1]}"
      array[$index]="$file"
    }
done

for index in "${array[@]}"
do
  echo $index
done

# or
printf "%s\n" ${array[@]}

おすすめ記事