「touch」コマンドの正当な使用法は何ですか?


83

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

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


15
代わりにecho -n > filename、次のことを実行することができます:>filename
AMADANON株式会社

77
何で違法な用途は?
bmargulies 14年

10
Unless to create the false impression about the age of a file。間違った印象は必要ありません。変更時刻を変更する場合はどうなりますか?スクリプトで役立ちます。このスクリプトtouchコマンドに大きく依存しており、そのようにするのは非常に便利で簡単です。
VL-80

7
tarアーカイブを抽出するときに何を行うか(または他のデアーカイバ)を検討します。通常、ファイルの変更時刻は、アーカイブが抽出された時刻ではなく、アーカイブからの時刻に設定されます。これは望ましい機能です。ユーザーモードプログラムが偽のタイムスタンプを作成するのは合法であるためtouch、コマンドライン引数に基づいて許可しない理由(または他のコマンドラインプログラム)についてはあまり議論がありません。Cを学習しても、shスクリプトを書く人よりも正当なものにはなりません;
スティーブジェソップ

5
UNIXではage、ファイルを説明するタイムスタンプはありません。これはcreationタイムスタンプになり、UNIXのファイルにはそのようなタイムスタンプはありません。
ケビンフェガン

回答:


98

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

合法的な使用例としては、ソースコードファイルのタイムスタンプを更新して、プログラムmakeがコンパイル済みオブジェクトよりも新しいソースファイルを考慮して再構築するようにすることがあります。

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


18
別の一般的な使用法:ファイルを特定の日付にタッチしてから、「find / -newer / the / file」を選択して、それ以降に変更/作成されたすべてのファイルを検索します
Olivier Dulac

@caseyのドキュメントを確認するecho -nと、「末尾の改行を出力しない」というメッセージが表示されます。だから、どうすれば空のファイルを作成できるのかわかりません。はっきりさせてください。
オタク

3
@Geek echo -nは空の文字列を出力し、それ自体は何もしません。経由で出力をリダイレクトする>>と、空の出力がファイルに追加されます。ファイルが存在しない場合、リダイレクトによりファイルが作成されます。
ケーシー

6
これは機能しません。出力用に既存のファイルを開いても書き込みはしませんが、mtimeは変更されません(とにかく私のシステムでは)。たとえそれが行われたとしても、echo -n何もしないコマンドは必要なく、使用すべきではありません。echo -n一部のシェルで文字列「-n」を出力する場合があります。あなたが本当に何もしない、:またはtrueより良いオプションであるコマンドが本当に必要な場合、>> myfileそれ自体が存在しない場合にファイルを作成する完全に有効な方法でもあります。もちろん、これはすべて、「タッチ」を使用する必要があるという答えをサポートします。
hvd 14年

40

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

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

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

201311010000 2013年11月1日を意味する計算方法は?これを教えてくれるユーティリティはありますか?言い換えると、タッチする入力をどのように決定するのですか?
オタク

4
@Geek番号を見て、最初の部分、、または2013年11月1日に20131101分解できることに注意してください2013-11-01。その後、0000部分が特定の時刻(この場合は00時間00分)を示すと想定できます。または、のmanページを見るだけでtouch、フォーマットが何であるかがわかります(を参照-t)。
JAB

@Geekマンページはあなたの友人です:
JRFerguson 14年

39

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、ファイルがリストされているときにファイルが使用しているブロックの数を示します。に-sスイッチを追加すると、この事実を確認できますls。これにより、各ファイルで使用中のブロックがリストされます。ここでは、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.タッチ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を参照してください。「変更」タイムスタンプをトリガーせずにファイルにできることは何ですか?


@sim:私の質問は、タッチがタイムスタンプを変更するためであることを知っていることを意味します。正直なユーザーがそれを望む理由を知りたかっただけです。それがあなたの答えのctimeの部分ではなかった場合、私はあなたに-1を与えていたでしょう。
Quora Feans 14年

16
@QuoraFea-私の答えはあなたの利益のためであり、将来それを見つけたすべてのユーザーのためです。答えがあなたのためだけのものであると思い込まないでください。私があなたを怒らせたら申し訳ありません。それは私の意図ではなく、単に時間の仕組みの基礎を説明しようとしただけです。
slm

@sim:私は気分を害していません。答えが正しい方向に進まないと思っただけです。とにかく、この答えをありがとう。
Quora Feans 14年

@QuoraFea-どういたしまして、Qに感謝します。彼らは感謝しています!
slm

1
@Geek-コマンドを試してください。これはls -l、ファイルのサイズが0で、まだ何も存在しないディレクトリからの正しい出力です。ファイルサイズのいずれかを指定するとすぐに、合計がファイルで使用中のブロックの量とともに表示されます。確信が持てない場合は私の更新を参照してください。例を追加しました。
slm

20

あなたが得た他の2つの非常に良い答えとは別に、あなたの言葉では、別の用途は

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

たとえば、バックアップスキームで使用します。バックアップが同じであるため、またはリモートホストへの低速回線などでバックアップを更新するための費用と比較して変更が重要ではないため、バックアップを新しいもので更新しないこともできます。これを達成するには、バックアップファイルを新しいタイムスタンプでマークするという単純なオプションがあります。偽造ではなく、そのファイルの有効性タイムスタンプが異なるものであることを宣言します。

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


20

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

通常のビルドツール(makeおよびその派生物)は、作成したファイルの1つが変更されない限り、ファイルを再コンパイル/再構築しないことで作業を節約しようとします(たとえば、.oファイルが.cよりも新しい場合)ソースは、通常、Cソースがそのオブジェクトファイルを生成するためにコンパイルされてから変更されていないと想定しても安全です。

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

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


ファイルを変更して再構築を行うのは良い考えですが、私はそれに反対します。一部のソースコードリビジョンシステムは、変更されたファイルについて混乱する可能性があります。だから、touchマニュアルの変更と同じくらい悪いです。再構築を行うには.o、問題のソースの出力ファイルを削除することをお勧めします。
ハーパー14年

1
.oファイルを手動で変更および削除するには、より多くの時間と入力が必要であり、手動での変更はよりエラーが発生しやすくなります。そして、私たちは作業コピーのタイムスタンプの変更についてのみ話します-後で編集が行われた場合、ファイルは変更タイムスタンプを正しく反映します。また、すべてのバージョン管理システムがタイムスタンプによって混乱しているわけではありません。
デビッド

1
デビッドが言ったように。これは、さほど昔ではない標準のUnixプラクティスでしたが、IDEの外部で作業する開発者にとっては依然として標準プラクティスです。
ケシュラム14年

12

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

もちろん、見ていなかったものを変更した後にリロードしたい場合がありますtouch。その場合、メインの構成ファイルを作成するとうまくいきました。

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


4
これは、実際にはmod_wsgiとapacheの場合です。wsgiファイルをタッチするだけで、たとえばdjango Webアプリをリロードできます。
サピ

11

タッチの正当な使用:

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

7

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

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

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

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


2
確かに。私が見つけたトラフ時間alias cp='cp --preserve=timestamps'は、PCの土地での私により適しています…
Runium 14年

5

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

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


2
>>上書きする代わりに追加します
マイケルMrozek

私はそれについて言及することを検討しましたが、副作用の領域にさらに入り込んでいます。また、ファイルが既に排他的に開かれている場合などにエラーがスローされるという事実にも言及する必要があります。>などの使用によっても適用される可能性のある問題。私の第2のポイント-ファイルの統計に触れるだけでわずかに速いという第1のポイントを超えて-茂みを打つのではなく、それを直接伝えるコードを書くことは良い考えだと思います。

4

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


2

多くの場合、root->他の何かなど、useridから変更するプロセスがあります。タッチを使用すると、アプリケーションが他のユーザーとしてログインを開始する前に、rootだけがタッチできる場所にファイルを作成できます。


それは、「エコー」によって達成不可能であるタッチの使用ではありません-作者の元の質問を参照
ドミンゴイグナシオGaldos

エコーには、ストリームのオープンなどが含まれます。タッチは、iノードを直接操作することでハイパー最適化できます。パフォーマンスFTW!
user56560

2

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

これらすべての異なる形式の簡単な検索とブラウジングを容易にするために、マップのjpegバージョンを作成し、タッチを使用してjpegファイルを元のソースファイルのタイムスタンプに一致させます。

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


1

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


1

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

設定を変更したくないが、リロードを強制したい状況がある場合は、タッチがここで役立ちます。


0

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

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.