web-dev-qa-db-ja.com

`touch`コマンドの正当な用途は何ですか?

touchコマンドの意味は何ですか?それで空のファイルを作成できることはわかっていますが、echo -nの場合も同様です。

そうでなければ、なぜ誰かがファイルのタイムスタンプを変更する必要があるのでしょうか?ファイルの古さについて誤った印象を与えない限り、他の用途は見られず、これは正当な用途ではありません(私の観点から)。

82
Quora Feans

touchの1つの利点は、任意のタイムスタンプを指定できることですが、echo -nは常に現在の時刻になります。

正当な使用の例は、ソースコードファイルのタイムスタンプを更新することです。これにより、makeのようなプログラムは、コンパイルされたオブジェクトよりも新しいソースファイルと見なし、再構築します。

他の用途は、それらの存在のみに基づいて機能するファイルを作成することです。 /etc/nologin:存在する場合、ログインを許可しません。また、touch myfileecho -n >> myfileよりも単純な構造であり、入力も短いと主張します。

97
casey

基になるシステムコール(utime)は、tarなどのさまざまなユーティリティが新しくコピーされた(tarされていない)ファイルのタイムスタンプを設定できるようにするために重要です。一部のバックアップユーティリティでは、コピーしたファイルの最終アクセス時間をリセットすることもできます。

touchの正当な用途の1つは、特定のタイムスタンプを持つファイルを作成することです。このような「参照」ファイルは、findなどのコマンドで使用できます。たとえば、2013年11月1日よりも最近変更されたすべてのファイルを検索するには(つまり、2013/11/01) "

touch -amt 201311010000 myref
find . -type f -newer myref -exec ls -ld {} +
39
JRFerguson

touchコマンドの主な目的は、ファイルのタイムスタンプを操作し、ファイルを作成することです。

1。ファイルの作成

$ ls -l
total 0

$ touch file{1..3}

$ ls -l
total 0
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file1
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file2
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file3

注:total 0からのls -l出力は正しいです。このlsの実装は、ファイルがリストされているときにファイルによって使用されているブロックの数を示します。 ls-sスイッチを追加することで、この事実を確信できます。これにより、各ファイルで使用中のブロックがリストされます。ここでは、file1とfile2に2文字を追加しています。

$ ls -ls
total 8
4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:07 file1
4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:09 file2
0 -rw-rw-r--. 1 saml saml 0 Jan 13 12:05 file3

2。ファイルの日時情報-statコマンド

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2014-01-12 13:33:38.279456149 -0500
Modify: 2014-01-12 13:33:38.279456149 -0500
Change: 2014-01-12 13:33:38.279456149 -0500
 Birth: -

touchを使用して、特定のファイルのさまざまなタイムスタンプを操作できます。

3。 touch manページからの抜粋

   -a     change only the access time
   -m     change only the modification time
   -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time

4。アクセス時間の操作

$ touch -a -t200001010000 file1

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2000-01-01 00:00:00.000000000 -0500
Modify: 2014-01-12 13:33:38.279456149 -0500
Change: 2014-01-12 13:38:52.023434696 -0500
 Birth: -

5。修正時間を操作する

$ touch -m -t200001010000 file1

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2000-01-01 00:00:00.000000000 -0500
Modify: 2000-01-01 00:00:00.000000000 -0500
Change: 2014-01-12 13:39:31.060432026 -0500
 Birth: -

変更時間(ctime)について疑問に思うかもしれません。 touchを使用して操作することはできません。これにより、ファイルでメタデータが変更された時間が追跡されます。詳細については、このU&L Q&Aを参照してください。タイトルは 「変更」タイムスタンプをトリガーせずにファイルに対して何ができますか? .

38
slm

touchの最も一般的な使用法の1つは、コードの再構築をトリガーするためです。

通常のビルドツール(makeとその派生物)では、ファイルの作成に使用されたファイルのいずれかが変更されない限り(たとえば、.oファイルが。 cソース。オブジェクトファイルを生成するためにコンパイルされてから、Cソースは変更されていないと通常は安全です。

しかし、何かを強制的に再構築したい場合があります。ソースファイルの1つに不必要な変更を加えることができますが、それは誤って何かを損傷する危険があります。代わりに、単にファイルをtouchにして、内容を変更するリスクなしにファイルを新しく見せることができます。これで、makeに、そのファイルに依存するすべてのものを再構築するときが来たと確信させることができます。

他の用途もありますが、歴史的にはそれが大きな用途でした。

20
keshlam

あなたが得た他の2つの非常に良い答えとは別に、あなたの言葉では、さらに別の使い方は

ファイルの古さについて誤った印象を与える

たとえば、バックアップスキームで使用します。バックアップが同一であったり、リモートホストへの低速回線などでバックアップを更新するコストと比較して変更が関係ないため、バックアップを新しいもので更新しない方がよい場合があります。これを実現するには、バックアップファイルを新しいタイムスタンプでマークするという簡単なオプションがありますfakingではなくdeclaringそのファイルの有効性タイムスタンプが別のものであること。

ファイルの古さについての印象は確かに偽ですが、その意味は本物で正当です。

20
LSerni

私は少なくとも1つのWebフレームワーク(どちらか覚えていない)で作業しましたが、開発モードではソースコードファイルの変更を監視し、それが発生したときにアプリケーションを再ロードしました。

もちろん、監視していないものを変更した後で再読み込みしたい場合もあるでしょう。その場合、メインの構成ファイルをtouchingするとうまくいきます。

そのため、一般的なケースでは、ファイルを実際に変更せずに、ファイルの変更によってトリガーされるプロセスを開始する必要があります。

12
millimoose

タッチの正当な使用:

  • 画像ファイル(GIF/JPG/etc)のタイムスタンプを、取得した時刻に更新します。すべてのレンダラーがEXIF情報を読み取るまたは注意するわけではありません。
  • ファイルのバンドルでタイムスタンプが重要なファイルセットを一括更新する場合は、c/m-timeを維持します。
  • 失敗後に別のインポートを行う必要があり、インポートプログラムがタイムスタンプに依存している場合は、バッチ(つまりCSV)ファイルの時間を設定します(その説明は別のトピックに任せてください:-))。
  • アーカイブ目的。つまり、年に基づいてフォルダーにバックアップを作成し、これらのフォルダーの時刻をJan 1 YYYYに設定して簡単にソートできるようにします。
11
sastorsl

1つの用途は、不適切に設定されたファイルのタイムスタンプを修正することです。

たとえば、ファイルをコピーするほとんどすべての方法(およびファイルを移動するいくつかの方法)では、元のファイルのタイムスタンプではなく、現在のタイムスタンプを持つ新しいファイルが生成されます。

通常、これは望ましいことではありません。タッチすると「修正」できます。

もう1つの用途は、ファイルのタイムスタンプを「編集...元に戻す」操作の前の状態に復元することにより、元に戻されたファイルの変更を反映することです。

7
Kevin Fegan

thingsのようなechoとの重要な違い(またはさらに良い> file他の人が述べたように)タッチはコンテンツを壊しません。 > fileはファイルを空にします。 touchはしません。コンテンツの損傷を回避するためのトリックを考える代わりに、タッチを使用してください!とにかく、カーネルでの作業は少なくなります。これは、実際にオープンの準備をしてからクローズを実行する時間を無駄にすることなく、ファイルの属性でのみ機能するためです。

ファイルが現在必須ロックまたはアドバイザリロック、または排他的に開いている場合でも、タッチによってタイムスタンプが変更される可能性があります。うーん、テストしたことも、読んだこともない...

5
user56373

ここに1つあります-私はSageTVと呼ばれるソフトウェアプログラムを使用してテレビ番組を録画します-これらは、MPEG-2で録画されることが多く、非常に効率的なコーデックではなく、iPad/iPhoneにも対応していません。そこで、ファイルを.mp4ファイルに変換します。しかし、ファイルを再生するとき、SageTVは、ファイルのタイムスタンプがテレビ番組の開始時であることを期待します。そうでない場合、番組のタイムラインをめちゃくちゃにして、FFやREWを行うのは簡単ではありません。したがって、私はtouchを使用して、.mp4ファイルのタイムスタンプを元のファイルと同じになるようにリセットします。
それは合法ですか?

4
Wayner

職場には、15年以上前のデジタルマップのアーカイブがあります。これらの古いマップは、PostScript、EMF、PRN、hpgl2、pdfなど、ほとんどのプログラムが理解できないさまざまな形式で保存されます。または、それらをすべて表示するには、12の異なるプログラムが必要です。

これらすべての異なるフォーマットを簡単に検索および参照できるように、マップのjpegバージョンを作成し、タッチを使用してjpegファイルを元のソースファイルのタイムスタンプに一致させます。多くの場合、元のファイルが作成されてから数年後です。

これで、Picasaなどの単一のプログラムを使用してライブラリ全体を表示し、特定の日付範囲を簡単に見つけることができます。手を使わずに、おそらく手動ですべての画像に日付メタデータを追加し、特定の日付範囲を探すときにそれらの文字列を検索する必要があります。

2
matt wilkie

多くの場合、rootなどのユーザーIDから別のプロセスに変更されるプロセスがあります。タッチを使用すると、アプリケーションが他のユーザーとしてファイルへのロギングを開始する前にrootのみがタッチできる場所にファイルを作成する機会が与えられます。

2
user56560

一部のinitスクリプトは、構成ファイルのタイムスタンプを独自のpidファイルと比較します。結果は、実行中のサービスを再ロードするかどうかを決定します。

設定を変更したくないが、強制的に再読み込みしたい場合は、touchが役立ちます。

1
Nils

この目的にはまだ使用していませんが、ディレクトリからファイルとその日付を読み取り、それらをWebページで使用するために読み取るスクリプトがあります。編集する必要がある場合は、日付が変更されます。注文をリセットするようにtouchingすることを検討しました。

1
TecBrat

ジョブの最後の実行と現在の実行の間に発生したデータベースから変更を取得するcronジョブがあります。変更のXMLファイルが生成され、別のデータベースで処理されます。 XML出力ファイルのタイムスタンプから最後の実行時間を取得します。*

XMLファイルの処理で問題が発生した場合は、新しいXMLファイルのタイムスタンプで参照されている日付からではなく、元の日付から実行を繰り返すことができます。

呼び出されるスクリプトなどを編集するのではなく、これを行う最も簡単な方法は、XMLファイルを操作して、タイムスタンプを必要な日付にすることです。

また、(以前のXML出力ファイルがない状態で)新たに開始した場合、タッチを使用してその存在を簡単にシミュレートできます。

[*]誰かが指摘する前に-私はジョブが開始する時間を理解し、XMLファイルの書き込みがDBの変更が発生する可能性がある数分の時間ギャップを残します。ジョブは、DBの変更が非常に発生しにくいときに実行されます。それは私の言い訳であり、私はそれに固執しています:-)

0
Geeb