タッチとviの使用?


55

編集前にタッチでファイルを作成する利点はありますか。

touch foo
vi foo

すぐに編集者に届くのですか?好む:

vi foo

私は(元を使用してかなりの数のチュートリアルを参照してくださいtouch、その後vi)。

回答:


111

touchファイルを最初に確認することで、ファイルシステムが読み取り専用またはその他の問題であることを確認するためだけにエディターで時間を浪費するのではなく、実際にファイルを作成できることを確認します。


6
またtouchchmod +x後で編集する前に行うことができます。これは、#!/bin/bashシェルスクリプトを記述する場合に意味があります。
アーロンマクデイド

11
または、:w開始後に最初に行うこともできviます。(そして:chmod +x %あなたはそれを実行したい場合)
ステファンChazelas

26
touchどこ失敗する可能性viのが:w!(例えば場合かかわらず、成功しただろうfileが存在していますが、その所有者以外の方は、現在のディレクトリへの書き込みアクセス権を持っていながら、それへの書き込みアクセス権を持っていません)。逆に、touch成功するかもしれませんが、vi年代:w:w!(あなたがそれを回避することができると思いますが、ファイルの所有者であれば失敗することがありますが、それへの書き込みアクセス権を持っていたり、現在のディレクトリにありません:!chmod +w %(一部viのような実装vimを行うことができます自動的に:w!)))。
ステファンシャゼル

今ではとても理にかなっています!
ファウィックス

4
Vim / viは、書き込み権限のないファイルを開いた場合、非常に明確に述べています"foo" [readonly]。そして再び挿入モードに入ったとき:Warning: Changing a readonly file.
DevSolar

25

与えられた答えとは別に、タッチの利点の1つは、タッチ中に同じファイルを編集している他のユーザー/端末が、変更を保存しようとすると警告を受け取ることです。

WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?

これ自体は変更を加えておらず、ファイルに触れただけでも警告を発します。


良い点なので、人々が同じファイルを使用/編集していて、同時に警告しているのかどうかを知るには本質的に良い方法です。マルチテナント環境では、そのメリットが明らかです!
ファウィックス

@Fawixその後、この回答を更新する必要がありますAswell
Kiwy

19

受け入れられた答えとは別に:

touchファイルのタイムスタンプを更新するために使用されることに注意してください。touch存在するファイルで使用すると、ファイルのタイムスタンプが現在の日付と時刻に更新されます。ファイルが存在しない場合、現在の日時をタイムスタンプとして空のファイルを作成します。

vi一方、書き込みを行わない限り、新しいファイルは作成されません。

たとえばvi test.txt、入力した場合、いくつかのメモを入力してから、入力しました:q!test.txt存在しません。


受け入れられた回答に記載されている利点はどうですか?
-JBentley

8

を指定しないtouchと、vi書き込みを指示するまで新しいファイルは存在しません。

マルチユーザーシステムを検討します(おそらく、それぞれが多くのユーザーを持つ多くのシステムで共有されるネットワークマウントされたファイルシステムを使用している場合)。実行touchすることで、ファイルを保持し(そして書き込み可能)、タイムスタンプも更新します。そのようなファイルを作成したい別のユーザーは、あなたがそれを所有していることがわかります。すでに存在し、別のユーザーがそれを削除または置換したい場合、最近変更されたことがわかり、おそらく考え直します。


4

touch最初に登録してもメリットはありません。viファイルが存在しない場合は作成されます。

受け入れられた答えは、エディターで時間を浪費する前にそこに書くことができるかどうかをチェックするということです。確かに、今度はtouch毎回入力する時間を無駄にします。どこかに書き込めないことは、それがちょうど動作する頻度と比較してかなり例外的です(sudoホームディレクトリまたは/tmp、またはroot 以外のファイルを覚えているか、rootとしてログインしている限り)。

エディターを開いて必要な操作を行い、ファイルを保存してみてください。でも動作しない場合は:w!、で保存し(:w ~/asdf)、問題を修正します。修正したら、ファイルの内容を一時ファイルから元のファイルにコピーできますcat ~/asdf > /mnt/example.txt && rm ~/asdf。我々が使用する理由catの代わりに、mvまたはcp目的地の権限およびその他の属性を使用することです。

さらに、いくつかのより高度なコマンドラインの使用法では、問題を修正する(または、またはを使用)ときにバックグラウンドviCtrl+ Zを使用し:suspend:sus最後fgに再度書き込みコマンドを実行します。

編集:/ u / G-Manのコメントに応じて投稿が改善されました。ありがとう!


3
ここにはいくつかのセキュリティ上の問題があります:(1)ファイル/mnt/example.txtが誰でも読めるようになっていないが、umaskが22のような寛容なものに設定されている場合、誰でも読めるように/tmp/asdf なります。システム上に他の人がいる場合、その人はファイルの一時コピーを読み取ることができる場合があります。(2)ファイル/mnt/example.txtはおそらく誰でも書き込み可能とは想定されていませんが、システムに悪意のある人がいる場合、移動/コピーする前にファイルの一時コピーを読み取って変更バージョン置き換えることができる場合があります正しい場所に戻ります。  …(続き)
G-Manは「Reinstate Monica」と言います

3
(続き)…(スティッキービットをオンに設定すると、/tmpこれを防ぐことができます。)(3)コマンドmv /tmp/asdf /mnt/example.txtは、電流を完全に破壊し、/mnt/example.txtそれをに置き換え/tmp/asdfます。あなたは交換したいコンテンツ/mnt/example.txt持つコンテンツのを/tmp/asdf。使用するとmv、あなたはセットアップ/mnt/example.txtと同じ持つ属性として/tmp/asdf、おそらくあなたと世界可読によって所有さを- 。これは、より良いかもしれませんcp /tmp/asdf /mnt/example.txtかさえもcat /tmp/asdf > /mnt/example.txt。…PS(4)viを入力して一時停止できます:suspend(または:sus、略して)。
G-Manが「Reinstate Monica」と言う

@ G-Manこれらはいくつかの良い点です。ファイルが入っている5分間に誰かがファイルを盗むことは特に怖くは/tmpありませんが、~/代わりに書き込みをしない理由はありません。また、属性を置き換えるとは考えていませんでした。投稿を編集します、ありがとう:)
リュック

3

メリットはありません。vi存在しない場合はファイルを作成します。


1

vi ビジュアルテキストエディター(vi = visual)とにかく「ed」と比較して視覚的であり、一度に1行のテキストを表示および変更できます。

このtouchコマンドは、既存のファイルのタイムスタンプを更新するか、ファイルが存在しない場合は新しいファイルを作成します。タイムスタンプに大きく依存するものをテストするのに適しています。

ファイルがテキストファイルである場合、またはまだ存在しない場合は、viでファイルを開き、viにコマンド:wqを発行すると、そのファイルに触れた場合と同じ結果になります。これが、2つのコマンドがまったく似ている唯一の方法です。


1

具体的で使用するためにviあなたはそれを編集する前にファイルを作成する必要はありません。vi新しいファイルを作成し、保存するために使用することができます。ただし、ファイルが存在する必要がある呼び出しコンテキストがあります。たとえば、私のシステム(OS X)では、次のような適切なGUIエディター(ファイルの種類によって決定)を起動できます。

open foo.txt

これはfoo.txt、TextEdit、emacs、またはテキストファイル用に選択したエディターとして指定したもので開き、プロンプトをすぐに戻すようにプロセスをデタッチします。(open bar.pyIDLE、Pythonエディターなどで開く場合があります。)または、明示的にemacsを要求できます。

open -a emacs foo.txt

ただしopen、ファイルが既に存在している必要があります。存在しない場合、エラーが発生します。そのemacsため、次のシェル関数を定義する必要がありました。これによりemacs fooemacsGUI fooが存在しない場合でもGUI を起動するように記述できます。

function emacs () 
{ 
    if [ -n "$1" -a ! -e "$1" ]; then
        /usr/bin/touch "$1";
    fi;
    open -a emacs "$@"
}

0

viはユーザーとしてファイルを編集するために使用されますが、touchはファイルにタイムスタンプを設定でき、主にスクリプトなどで使用されます。

ファイルを作成する別の方法は次のとおりです。

>newfile.txt

1
これは、POSIX仕様で(afaik)指定されていないため、信頼できません。たとえば、In zshでは、cat >newfile.txtCtrl + Dを押す必要があります。
アダムカッツ

@AdamKatzの良い点; アドバイスをありがとう、答えを更新しました。
ジェームズヤングマン

0

マニュアルページでは、主な仕事はファイルのタイムスタンプを変更することです。
Ofcは現在のタイムスタンプでファイルを作成しているので、ファイルを編集できます。

VIは、テキストの編集、開く、保存、ファイルの編集などを行うテキストエディターです。

すべてがユーザーとハビットのフレーバーです。viまたはvi file.txtをタッチすると、同じものが異なる色になります。


0

touch コマンドは、現在のタイムスタンプでファイルの日付と時刻を変更します。
ファイルが存在しない場合は、日付と時刻を含む新しいファイルが作成されます。

vi エディターは、ファイルが存在しない場合にファイルを編集するために使用され、ファイルを保存しない限り、新しいファイルを作成します。

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