touch fileと> fileの違いは何ですか?


17

私はLinuxの初心者>touchあり、同じ効果があるかどうか疑問に思っています。つまり、次の2つのコマンドは同じ効果がありますか?

$ > file.txt

$ touch file.txt

もしそうなら、 `> file.txt 'と入力して新しいファイルを作成できることを知っておくといいでしょう。


5
場合はfile.txt、すでに存在し、空ではありませんが、彼らは確かにしないでください。
fkraiem

1
@fkraiem、詳細な回答をお願いします。
lmiguelvargasf

4
彼はあなたtouchがデータを含むファイルは何も起こらないが、あなたが>そのファイルを消すなら何も起こらないと言っています。
WinEunuuchs2Unix

わかった。@ WinEunuuchs2Unix
lmiguelvargasf

質問に答えますか、質問に答えてください、@ fkraiemに答えてもらいますか、それとも削除しますか?
WinEunuuchs2Unix

回答:


24

両方でtouch>存在しない場合は新しいファイルを作成します。次の端末コマンドはtouch、既存のファイルを表示するとアクセス/最終変更時刻が更新されることを示しています。ただし>、既存のファイルに移動すると、ファイルは切り捨てられ、最終変更時刻が更新されます(アクセス時刻は更新されません)。>ファイルを削除/リンク解除しないことに注意してください。iノードは同じまま-理由である>/またはtruncate一般的にも、開いているファイルハンドルにログファイルをクリアするために使用されています。

rick@dell:~$ > EmptyFile

rick@dell:~$ touch EmptyFile2

rick@dell:~$ ls Empty*
EmptyFile  EmptyFile2

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ echo Hello > EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 6 Sep 29 20:28 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ > EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 0 Sep 29 20:28 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ echo Hello > EmptyFile

rick@dell:~$ touch EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 6 Sep 29 20:32 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

コメントで述べたようにtouch、外部コマンドであり、ファイルに対してのみ動作します。>は、さまざまな目的に役立つシェルの組み込み機能です。通常、次のように使用されcat source.fil > target.filます。

ファイルを空にする長い形式は次のとおりです。

cat /dev/null > emptyme.fil

を使用> emptme.filすると、ファイルに何もリダイレクトしないコンパクトな形式で同じことが実現します。


使用例:> file.txtログファイルを消去するのに適しています。
リンツウィンド

8
実際には再作成されません。既存のファイルは切り捨てられます。これは、古いファイルのリンクを解除して新しいファイルを作成することとは異なります。目に見える最大の違いは、プロセスがまだ古いファイルを開いているかマップしている場合、それはまだ存在するということです。ただし、切り捨ては、他のプロセスが開いているファイルに影響を与えます。
ピーターコーデス

1
必ず「最大の観測可能」ではない-それはハードリンクが壊れているかどうかを観察するのは簡単です(もしあればln foo bar、その後、削除して再作成foobarまだその前の内容を持っています)。
チャールズダフィー

1
そうそう、それはさらに簡単に観察できる違いです。私はそのことを考えるべきでした:P
ピーター・コーデス

@ Charles-Duffyもちろん、ピーター・コーデスが言っていることとは何の関係もない、明らかなはずのフィーへのリンクが2つあるとき。現在使用中/開いているファイルハンドルを持っているファイルを削除/リンク解除しても削除されません。たとえば、rm /var/log/nginx/access.lognginxがそのファイルを開いている間、リンクは0になりますが、iノードはまだ存在するとします。 lsof -c nginx | grep access.log次にpidを使用しls -l /proc/<pid>/fd/ | grep access.log、最後にcat / proc / <pid> / fd / <前のコマンドのファイル名> `を使用します。これは古いですが、コメントします。それが理にかなったことを願って
スクルーラー

14

2つの間には大きな違いがあります。 Touchファイルにタイムスタンプを付けるために使用されるコマンドです。>記号は標準出力リダイレクタです。

説明した2つの使用法

タッチの使用法

ファイルが存在しない場合、ファイルが作成されます。

タッチは一般的にフラグを作成するために使用されます。たとえば、システムで2回の間にすべてのファイルを検索する場合、次のコマンドシーケンスを使用できます。

$ touch -t 201609292200 starttime 
$ touch -t 201609292300 endtime

これにより、次のファイルが作成されます(または、存在する場合はタイムスタンプが変更されます)。

-rw-rw-r-- 1 ljames ljames 0 Sep 29 23:00 endtime
-rw-rw-r-- 1 ljames ljames 0 Sep 29 22:00 starttime

これで、findを使用して、その時間(これら2つのファイルのタイムスタンプ間の時間、つまり2016年9月29日の午後10時から午後11時まで)に変更されたすべてのファイルを表示または処理できます。

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n"

これは、上記のfindコマンドの部分的な出力です。

-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/apollothethird@gmail.com_groups.xml
-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/apollothethird@gmail.com.xml
-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/address_book_backups/abook.mab.bak
-rw-rw-r-- 09/29 23:00 00 /home/users/l/j/ljames/endtime
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/Temp
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/fahmaaghhglfmonjliepjlchgpgfmobi
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/fahmaaghhglfmonjliepjlchgpgfmobi/1.337.0_0

出力リダイレクトの使用

リダイレクトシンボルは、標準出力を指定されたファイルにリダイレクトします。clobber / noclobberの設定によっては、失敗する可能性があります。Noclobberは、ファイルが存在しない場合にのみファイルを作成します。

リダイレクト出力には次のような多くのバージョンがあります。

>-標準出力をリダイレクトします。既存のファイルを作成または上書きします。
>>-追加をリダイレクトします。既存のファイルを作成または追加します。
>&-標準出力と標準エラーの両方をリダイレクトします。
>>&-標準出力と標準エラーの両方をリダイレクト/追加する

find上記のコマンドを使用して、指定された時間内に作成されたすべてのファイルの内容を、後でログに記録して調査できるファイルにリダイレクトできます。

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n" > ~/files.log

多くの人々は、file.txt存在し、空でない場合、> file.txtその内容を消去しますが、消去しないと述べてtouch file.txtいます。しかし>> file.txttouch file.txtこれに代わる適切な代替手段については誰も言及していません。ファイルが存在しない場合は作成します(許可されている場合)が、既存のファイルは切り捨てられません。参照してください。「>」と「>>」の違いは何ですか?
G-Manは「Reinstate Monica」と

これはセクションで説明されUsage of Output redirectionます。通知はsays >>= Redirect append>です。
LDジェームズ

はい、それは完全に明白です-すでにそれを知っている人々に。OPの靴に身を任せてください-あなたはToo Long Too Readのテキストの壁を投稿しました。彼はあなたの答えから理解すること>> file.txtはできませんtouch file.txt。(あなたが言及した唯一の人物だという事実>> のすべてでは、私はあなたの答えの下ではなく、質問の下に私のコメントを投稿する理由である。)
G-マンは「元に戻すモニカ言う

1
@ G-Man一部の人々は、リダイレクト記号をタッチの代わりと混同しています。ただし、これは代替ではありません。私の答えの詳細は、この間違いを明確にすることです。この2つの使用例は、わかりやすくするためのものです。最初の数行は、現在のコメントの最初の詳細に答えていることに注意してください。2つの間に大きな違いがあると述べています。OPはその違いに関心を持っています。そのため、答えの他の部分は、2つのOPの関心に対応することです。さまざまな効果があり、違いには理由があります。
LDジェームズ

9

>シェル出力リダイレクト演算子であり、前のコマンドのSTDOUTを後述のファイル記述子にリダイレクトするために使用されます>。ファイルが存在する場合はopen(2)O_TRUNCフラグ付きの-edが付いたファイルとしてコンテンツが切り捨てられ、ファイルが存在しない場合は作成されます。

このリダイレクション演算子は、前のコマンドが実行される前にシェルによって処理されるため、コマンドに依存せず、シェル自体によって処理されることに注意してください。

いくつかのシェル(例zsh:)は、次のような空のリダイレクトでは異なる動作をすることに注意してください。

 >file.txt

一般的な回避策は、:true)no-opコマンドを追加することです。

 : >file.txt

従来、touchファイルの作成ではなく、ファイルのタイムスタンプを変更することが主な目的でした。

touch引数で指定されたファイルが存在しない場合にのみファイルを作成します。そうでない場合は、ファイルの変更時刻を現在のタイムスタンプに変更します。を使用して、アクセス時間とiノード作成時間を変更することもできますtouch


zsh空のリダイレクトをサポートします- catファイルへの引数なしのリダイレクトと非常によく似た動作をします。基本的に、入力した内容はすべて、EOF文字または割り込みが発生するまでファイルに書き込まれます。これは、のようにファイルの内容を単純に出力するzshjustだけ<fileで動作をミラーリングしますcat。これらは設定可能かもしれません<fileが、ページャーでファイルを開くのを見てきました。
8ビットツリー

@ 8bittree私が意味したのは、あなたが入力する必要があるということですEOFcat >file.txtあなたが言ったように行うことのように)、どこでもbash行うだけで>file.txt十分です。
-heemayl

案の定、私はアイデアをより明確に理解できると思う編集を提案しました。
8ビットツリー

@ 8bittree承認済み。
-heemayl

(1)デフォルトでtouchは、ファイルの変更時刻とアクセス時刻の両方を更新します。どちらか一方のみを更新するオプションがあります。(2)Unix / Linux / POSIXは、一般に「inode作成時間」をサポートしません。一部のファイルシステムタイプではサポートされていますが、それを変更することはもちろん、普遍的な方法で見ることはできません。touchユーザーがiノードの作成時間を変更できるようにするインカネーションがあるという参照を提供できますか?
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.