12

私はbashを使用して、変数でファイル名を取得し、この変数でファイルunixの最終変更日を取得するスクリプトを作成しています。

この変更日の値を取得する必要があり、statコマンドを使用できません。

一般的に利用可能な*nixコマンドでそれを取得する方法を知っていますか?

4

5 に答える 5

18

使用しない理由ls:

解析lsは悪い考えです。ファイル名の特定の文字の動作が未定義でプラットフォームに依存するだけでなく、目的のために、過去 6 か月の日付を混乱させます。要するに、はい、限られたテストではおそらくうまくいくでしょう。プラットフォームに依存しない (移植性がない) わけではなく、さまざまなシステムでの「正当な」ファイル名の範囲を考えると、解析の動作は保証ません。(たとえば、Ext4 ではfilenames にスペースと改行を使用できます)。

とはいえ、個人的には、ls高速で簡単なので使用します ;)

編集

コメントでヒューゴが指摘したように、OP は を使用したくありませんstat。さらに、以下のセクションは BSD 統計固有のものであることを指摘しておく必要があります ( %SmUbuntu でテストした場合、フラグは機能しません。Linux にはstatコマンドがあります。興味がある場合は、man ページを読んでください)。

したがって、非stat解決策: use date

date、少なくとも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 など) の場合、これは機能しません-rBSD-dateのフラグは、まったく異なることを行います。この質問は、ソリューションがどの程度移植可能である必要があるかを正確に指定していません。BSD ベースのソリューションについては、以下のセクションを参照してください ;)

より良い解決策は、BSD システムです (OS X でテスト済み、BSD-stat を使用。GNU stat は少し異なりますが、同じ方法で動作させることができます)。

を使用し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" ./*

  1. stat -f: を呼び出しstat、フォーマット ( -f) を指定します。
  2. %m: UNIX エポック時間。
  3. %t: 出力のタブ区切り文字。
  4. %Sm:S出力を として表示することを示しstringmファイル変更データを使用することを示します。
  5. %N: 問題のファイルの名前を表示します。

次の行に沿ったスクリプト内のコマンド:

stat -f "%Sm" ${FILE_VARIABLE}

次のような出力が得られます。

Jun 26 21:28:41 2012

詳細については、のマニュアル ページを参照しstatてください。タイムスタンプのフォーマットは によって行われstrftimeます。

于 2012-06-26T21:24:51.307 に答える
4

perlを持っていますか?

perl -MFile::stat -e "print scalar localtime stat('FileName.txt')->mtime"
于 2012-06-26T23:07:34.003 に答える
3

どうですか:

find $PATH -maxdepth 1 -name $FILE -printf %Tc

%T で使用できるその他の値については、find マンページを参照してください。

于 2012-06-26T17:38:00.370 に答える
1

「date」コマンドを使用して、目的の形式オプションを形式に追加できます。

 date +%Y-%m-%d -r /root/foo.txt

2013-05-27

 date +%H:%M -r /root/foo.txt

23:02

于 2015-09-01T09:54:38.407 に答える
-2

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
于 2012-06-26T17:43:29.590 に答える