すべてがうまくいくことを願っています。
次のファイルがあります。
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
。 しないでください、できません。。