ファイルリスト(日付を含む)を日付リストに変換

ファイルリスト(日付を含む)を日付リストに変換

バックアップが保存されるディレクトリがあります。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再実行されるたびに日付を再解析する必要がなくなります。

関連情報