私はbashを使用して、変数でファイル名を取得し、この変数でファイルunixの最終変更日を取得するスクリプトを作成しています。
この変更日の値を取得する必要があり、statコマンドを使用できません。
一般的に利用可能な*nixコマンドでそれを取得する方法を知っていますか?
ls
:解析ls
は悪い考えです。ファイル名の特定の文字の動作が未定義でプラットフォームに依存するだけでなく、目的のために、過去 6 か月の日付を混乱させます。要するに、はい、限られたテストではおそらくうまくいくでしょう。プラットフォームに依存しない (移植性がない) わけではなく、さまざまなシステムでの「正当な」ファイル名の範囲を考えると、解析の動作は保証されません。(たとえば、Ext4 ではfilenames にスペースと改行を使用できます)。
とはいえ、個人的には、ls
高速で簡単なので使用します ;)
コメントでヒューゴが指摘したように、OP は を使用したくありませんstat
。さらに、以下のセクションは BSD 統計固有のものであることを指摘しておく必要があります ( %Sm
Ubuntu でテストした場合、フラグは機能しません。Linux にはstat
コマンドがあります。興味がある場合は、man ページを読んでください)。
stat
解決策: use datedate
、少なくともLinuxでは、フラグがあります: -r
、マニュアルページによると:
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 など) の場合、これは機能しません。-r
BSD-dateのフラグは、まったく異なることを行います。この質問は、ソリューションがどの程度移植可能である必要があるかを正確に指定していません。BSD ベースのソリューションについては、以下のセクションを参照してください ;)
を使用しstat
ます。stat
フラグを使用して出力をフォーマットし-f
たり、ファイル変更データのみを表示するように選択したりできます (これは、この質問にとっては良いことです)。
たとえば、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
最初のビットはUNIX エポック時間、日付はファイルの変更時間、残りはファイル名です。
コマンド例の内訳
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
詳細については、のマニュアル ページを参照しstat
てください。タイムスタンプのフォーマットは によって行われstrftime
ます。
perlを持っていますか?
perl -MFile::stat -e "print scalar localtime stat('FileName.txt')->mtime"
どうですか:
find $PATH -maxdepth 1 -name $FILE -printf %Tc
%T で使用できるその他の値については、find マンページを参照してください。
「date」コマンドを使用して、目的の形式オプションを形式に追加できます。
date +%Y-%m-%d -r /root/foo.txt
2013-05-27
date +%H:%M -r /root/foo.txt
23:02
whichを使用ls -l
して最終変更時刻をリストし、次に使用cut
して変更日を切り取ることができます。
mod_date=$(ls -l $file_name | cut -c35-46)
日付が列 35 から 46 の間に表示されるため、これは私のシステムでは機能します。システムで操作する必要があるかもしれません。
日付は 2 つの異なる形式です。
Mmm dd hh:mm
Mmm dd yyyy
1 年以上前に変更されたファイルは、新しい形式になります。1 年未満前に変更されたファイルは、最初にフォーマットする必要があります。「:」を検索すると、ファイルの形式がわかります。
if echo "$mod_date" | grep -q ":"
then
echo "File was modified within the year"
else
echo "File was modified more than a year ago"
fi