BASH:名前でグループ化して最後の名前を維持する

BASH:名前でグループ化して最後の名前を維持する

すべてがうまくいくことを願っています。

次のファイルがあります。

my_file_210804_2056_856.csv_20210804170806
my_file_210804_2056_856.csv_20211119181137
my_file_210805_2056_857.csv_20210805200847
my_file_210805_2056_857.csv_20211119181137
      ...

Unixコマンドでファイルの最後のバージョンを検索したいと思います。

たとえば、ファイルの場合210804私はただ取り戻したいmy_file_210804_2056_856.csv_20211119181137今回が最後だから。

ご協力ありがとうございます

答え1

NUL文字を使用してファイル名を区切るには、GNUバージョンの、findおよびsort(を使用します。 - NULはheadただパス/ファイル名に無効な文字なので、ファイル名区切り文字として安全に使用できる唯一の文字です。

find . -maxdepth 1 -type f -name 'my_file_210804*' -print0 | sort -z -r | head -z -n 1

これは、含まれる文字(スペース、改行などを含む)に関係なく、すべてのファイル名に適用されます。

ファイル名に改行文字がなく、将来も含まれないと確信している場合は、改行文字を区切り文字として使用できます。-print0コマンドからそれを削除しfind-zからsortオプションを削除しますhead

find . -maxdepth 1 -type f -name 'my_file_210804*' | sort -r | head -n 1

このバリアントは、ファイル名がプレーンテキストファイル(1行に1つのファイル名)の場合にも役立ちます。

sort -r filename-list.txt | head -n 1

ファイル名に含まれる日付と時刻ではなく、ファイルシステムのタイムスタンプに基づいてファイル名をソートしようとすると、状況がより複雑になります。代わりに-printf%T@\t%p\0-print0

find . -maxdepth 1 -type f -name 'my_file_210804*' -printf '%T@\t%p\0' |
  sort -z -r -n -k 1,1 |
  cut -z -f2- |
  head -z -n 1

ここでは、出力をソートするsort ... -k1,1ために使用されます。find最初フィールド(タイムスタンプ)を削除してから、タイムスタンプフィールドcutとそれをファイル名と区別するタブ文字を削除するために使用されます。


ところで、あなたは構文解析をしたいかもしれませんlsしないでください、できません。

関連情報