「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番目の列を数字またはアルファベット順に並べ替えることは役に立たず、日付順に並べ替える必要があることに気づきました。sort
6桁のフィールドを日付として処理する方法や、3つの2桁の列で処理する方法を知る方法がないようです。次のステップは、6桁のフィールドを解析可能なものに置き換えるのと同様のものをsed
使用することです。tr
sort
助けてくれてありがとう。
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[@]}