私はbashを使用して、変数でファイル名を取得し、この変数を使用してファイルunixの最終変更日を取得するスクリプトを作成しています。
この変更日の値を取得する必要があり、statコマンドを使用できません。
一般的に利用可能な* nixコマンドでそれを取得する方法を知っていますか?
ls
を使用すべきでない理由:解析 ls
は悪い考えです 。ファイル名内の特定の文字の動作が定義されておらず、プラットフォームに依存しているだけでなく、目的に応じて、 過去6か月の日付が混乱する になります。要するに、はい、それはおそらくあなたの限られたテストであなたのために働くでしょう。プラットフォームに依存しないnotであり(したがって移植性がない)、解析の動作はnotさまざまなシステムで「正当な」ファイル名の範囲が与えられると保証されます。 (Ext4、たとえば ファイル名にスペースと改行を許可します )。
とはいえ、個人的にはls
を使用します。これは、高速で簡単だからです;)
コメントでHugoが指摘しているように、OPはstat
を使用したくありません。さらに、以下のセクションはBSD-stat固有であることを指摘しておく必要があります(Ubuntuでテストすると%Sm
フラグは機能しません。興味がある場合はLinuxにstat
コマンドがありますその中で manページ )を読んでください。
stat
ソリューション:日付を使用date
は、少なくともLinuxでは、フラグ:-r
を持っています。これは、 manページ によると:
fILEの最終変更時刻を表示します
したがって、スクリプト化されたソリューションは次のようになります。
date -r ${MY_FILE_VARIABLE}
これはあなたにこれに似た何かを返すでしょう:
zsh% date -r MyFile.foo
Thu Feb 23 07:41:27 CST 2012
OPのコメントに対処するには:
可能であれば、構成可能な日付形式で
date
には、かなり広範な時間形式変数のセットがあります。詳細については、manページを参照してください。
date
がすべての「UNIXライクなシステム」でどれほど移植性があるかは100%わかりません。 BSDベース(OS Xなど)の場合、これは機能しません。 BSD日付の-r
フラグはまったく異なることをします。この質問は、ソリューションがどれだけ移植可能である必要があるかを正確に指定していません。 BSDベースのソリューションについては、以下のセクションを参照してください;)
stat
を使用します。 stat
の出力を-f
フラグでフォーマットでき、ファイル変更データのみを表示するように選択できます(この質問の場合はNiceです)。
例:stat -f "%m%t%Sm %N" ./*
:
1340738054 Jun 26 21:14:14 2012 ./build
1340738921 Jun 26 21:28:41 2012 ./build.xml
1340738140 Jun 26 21:15:40 2012 ./lib
1340657124 Jun 25 22:45:24 2012 ./tests
最初のビットが NIXエポック時間 の場合、日付はファイルの変更時刻であり、残りはファイル名です。
サンプルコマンドの内訳
stat -f "%m%t%Sm %N" ./*
stat -f
:stat
を呼び出し、形式(-f
)を指定します。%m
:UNIXエポック時間。%t
:出力のタブ区切り文字。%Sm
:S
は出力をstring
として表示することを示し、m
はファイル変更データを使用することを示します。%N
:問題のファイルの名前を表示します。次の行に沿ったスクリプト内のコマンド:
stat -f "%Sm" ${FILE_VARIABLE}
次のような出力が得られます。
Jun 26 21:28:41 2012
詳細については、 manページ for stat
をお読みください。タイムスタンプのフォーマットは strftime
によって行われます。
perlを持っていますか?
Perl -MFile::stat -e "print scalar localtime stat('FileName.txt')->mtime"
どうですか:
find $PATH -maxdepth 1 -name $FILE -printf %Tc
%Tで使用できる他の値については、検索のマンページを参照してください。
「date」コマンドを使用して、目的のフォーマットオプションを次のフォーマットに追加できます。
date +%Y-%m-%d -r /root/foo.txt
2013-05-27
date +%H:%M -r /root/foo.txt
23:02