Linuxでは、dd-mm-yyyy hh:m:sを使用してファイル名に基づいて最新のファイルを選択してください。

Linuxでは、dd-mm-yyyy hh:m:sを使用してファイル名に基づいて最新のファイルを選択してください。

次のファイルがあります

employee.arya-date-01-1-2022-time-22:42:00.txt.csv
employee.arya-date-02-1-2022-time-16:29:00.txt.csv
employee.arya-date-02-1-2022-time-19:35:00.txt.csv
employee.arya-date-03-1-2022-time-7:12:00.txt.csv
employee.arya-date-04-1-2022-time-16:33:00.txt.csv
employee.arya-date-04-1-2022-time-2:23:00.txt.csv
employee.arya-date-04-1-2022-time-7:2:00.txt.csv
employee.arya-date-29-1-2022-time-7:2:00.txt.csv

ファイル名の基準:最新のファイルは " employee.arya-date-29-1-2022-time-7:2:00.txt.csv"ですが、以下のようにコマンドを実行しようとすると、最新のファイルを " employee.arya-date-04-1-2022-time-7:1:00.txt.csv"として選択することはできません。

コマンドを試しましたが、機能しません。

ls employee.arya-*|sort -r|head -1

最新のファイルを入手する方法はありますか? lsとsortですべてのオプションを試しましたが、そのうち何も機能しませんでした。誰でもアドバイスできますか?

答え1

以下は、タスクを実行するクイックスクリプトです。

(注:ロケールをもう少し独立させるように変更しましたが、まだすべてのロケールで機能しない可能性があります。他の形式を許可するtimestamp=場合は、この行を編集してください。)date

#!/bin/bash
latest=''
latesttimestamp=0
for file in employee.arya-* ; do
    # remove everything up to -date-
    datetime="${file#*-date-}"
    # remove .txt.csv
    datetime="${datetime%.txt.csv}"
    # get the time (after -time-)
    time="${datetime#*-time-}"
    # get the date (before -time-)
    date="${datetime%-time-*}"
    # get the day
    dd="${datetime%%-*}"
    # get the month and year
    mmyy="${date#*-}"
    mm="${mmyy%-*}"
    yyyy="${mmyy#*-}"
    # get the timestamp for that datetime
    timestamp="$(date --date="$yyyy/$mm/$dd $time" +'%s')"
    # compare to latest found so far
    if [[ "$timestamp" -gt "$latesttimestamp" ]] ; then
        latest="$file"
        latesttimestamp="$timestamp"
    fi
done
echo "$latest"

latestfile.sh別の名前で保存します。 ()$PATHで実行可能にするだけです。chmod a+x latestfile.shlatestfile.sh

(必要に応じてシェル機能に簡単に切り替えることができます。)

関連情報