バックアップが保存されるディレクトリがあります。Complete Backup YYYY-MM-DD hh-mm-ss.tar.bz2
私が見つけた形式は、date
コマンドに日付を入力するために使用できますdate --date="YY-MM-DD hh:mm:ss"
。
それでは、空白で区切られた日付のリストをどのように取得できますか?日付は、書式設定のdate
ために呼び出しを介して実行する必要があります。
私は(一行に1つの項目)形式でリストを提供するこのコマンドを思い出しましたYYYY-MM-DD hh-mm-ss
。では、フォーマットを正しく指定し、それぞれに日付を追加し、スペースで区切りますか?
dir backups/ | grep '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\\ [0-9][0-9]-[0-9][0-9]-[0-9][0-9]\.tar\.bz2$' | sed 's/\\//g' | sed 's/\.tar\.bz2//g' | sed 's/Complete Backup //g'
注:出力は選択ループで使用されるため、日付に属するすべてのスペースをエスケープする必要があります。
答え1
以下は日付形式を再指定します。
dir -1 backups | awk '/Complete\\ Backup\\ .*\.tar\.bz2/ { gsub(/\\/, ""); sub(/Complete Backup /, ""); sub(/.tar.bz2/, ""); gsub(/-/, " "); print strftime("%c", mktime($0)); }'
これを選択項目に組み込む方法は次のとおりです。
OIFS="$IFS"; IFS=$'\n'; set -- $(dir -1 backups | awk '/Complete\\ Backup\\ .*\.tar\.bz2/ { gsub(/\\/, ""); sub(/Complete Backup /, ""); sub(/.tar.bz2/, ""); gsub(/-/, " "); print strftime("%c", mktime($0)); }'); IFS="$OIFS"
select date in "$@"; do echo "$date"; done
日付を並べ替えるバージョンは次のとおりです。
OIFS="$IFS"
IFS=$'\n'
set -- $(
dir -1 backups |
awk '/Complete\\ Backup\\ .*\.tar\.bz2/ \
{
gsub(/\\/, "");
sub(/Complete Backup /, "");
sub(/.tar.bz2/, "");
gsub(/-/, " ");
VAL[NR] = mktime($0);
}
END \
{
for ( i = asort(VAL); i > 0; i-- )
{
print strftime("%a %b %d %T %Z %Y", VAL[i]);
}
}'
)
IFS="$OIFS"
select date in "$@"
do
echo "$date"
done
答え2
ここにあります:
dates=($(for i in backups/*.tar.bz2;do #Glob eliminates need to list all files
date=${i/Complete Backup /} #Remove "Complete Backup "
date=${date%%.*} #Remove ".tar.bz2"
date=${date/ /,} #Substitue , for space
echo $date #Echo the date for sed
done|sed -e 's/\([0-9]\+\)-\([0-9]\+\)-\([0-9]\+\)$/\1:\2:\3/'|sort -r|xargs echo))
select date in ${dates[@]};do
echo "$date"
done
もう1つ:これをループに使用する場合は、スペースでselect
区切られた日付をどのように区別できますか?日付と時刻を区別するためにスペースを使用することを意味するので、混乱する可能性があります。
編集する
- ご意見がこのように並べ替える必要があることを提案したので、最新の項目から古い項目まで日付の並べ替えを追加しました。
select
日付と時刻のペアを新しい項目と区別できるように、日付と時刻をカンマで区切るコードが追加されました。データ全体をにラップして日付を配列に保存し、ループを繰り返してループがselect
ループselect
再実行されるたびに日付を再解析する必要がなくなります。