web-dev-qa-db-ja.com

ファイル名最終変更日スクリプト内のシェル

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

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

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

12
odew

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ベースのソリューションについては、以下のセクションを参照してください;)

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

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" ./*

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

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

stat -f "%Sm" ${FILE_VARIABLE}

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

Jun 26 21:28:41 2012

詳細については、 manページ for statをお読みください。タイムスタンプのフォーマットは strftime によって行われます。

17
simont

perlを持っていますか?

Perl -MFile::stat -e "print scalar localtime stat('FileName.txt')->mtime"
4
jm666

どうですか:

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

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

3
Alex Howansky

「date」コマンドを使用して、目的のフォーマットオプションを次のフォーマットに追加できます。

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

2013-05-27

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

23:02

1
user5287944