Dokunma ve vi kullanımı?


55

Düzenlemeden önce dokunuşlu bir dosya oluşturmanın yararı var mı?

touch foo
vi foo

derhal editöre almaya karşı? Sevmek:

vi foo

Birincisini kullanarak epeyce dersler görüyorum ( toucho zaman vi).

Yanıtlar:


111

touchönce dosyalama, yalnızca dosya sisteminin salt okunur veya başka bir sorun olduğunu bulmak için bir düzenleyicide zaman kaybetmekten ziyade, dosyayı oluşturma yeteneğiniz olduğunu doğrular.


6
Ve daha sonra, düzenlemeden önce bir kabuk betiği yazıyorsanız mantıklı olacak olan düzenlemeyi touchyapmanıza izin verir . chmod +x#!/bin/bash
Aaron McDaid

11
Alternatif olarak, ancak :wbaşladıktan sonra ilk şeyi yapabilirsiniz vi. (ve :chmod +x %çalıştırılabilir yapmak istiyorsanız)
Stéphane Chazelas

26
touchnerede başarısız olabilir vi'ın :w!olsa başarılı olurdu (eğer örneğin filemevcutsa ancak onun sahibi değilseniz ve geçerli dizine yazma erişimine sahip olmamakla birlikte, bu yazma erişimi yok). Tersine, touchbaşarılı olabilir ama vi'lar :wya :w!Dosyanın sahibi iseniz başarısız olabilir, ama bunun yazma erişimi yok ne de geçerli dizine (Birlikte etrafında çalışmak mümkün olurdu :!chmod +w %bazı ( vigibi uygulamalarda vimyapabilirsiniz Bu otomatik olarak üzerine :w!)).
Stéphane Chazelas

şimdi çok mantıklı!
Fawix,

4
Vim / vi, yazma izniniz olmayan bir dosyayı açarsanız çok açık bir şekilde belirtir "foo" [readonly]. Warning: Changing a readonly file.
Ekleme

25

Verilen cevapların yanı sıra, dokunmanın bir avantajı, dokunduğunuzda aynı dosyayı düzenleyen herhangi bir kullanıcı / terminalin, herhangi bir değişikliği kaydetmeye çalıştıklarında bir uyarı alacağıdır.

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

Bu, kendi başınıza herhangi bir değişiklik yapmamış olmanıza ve yalnızca dosyaya dokunmanıza rağmen onları uyaracaktır.


iyi nokta, bu yüzden insanların aynı dosyayı kullanıp / düzenlediklerini ve aynı zamanda onları uyarıp uyarlamadıklarını keşfetmenin iyi bir yolu. Çok kiracılı bir ortamda bunun net bir faydasını görüyorum!
Fawix,

@Fawix o zaman bu cevabı güncellemelisin
Aswell

19

Kabul edilen cevap dışında:

touchDosya zaman damgalarını güncelleştirmek için kullanılan dikkat çekicidir . Varolan touchbir dosyayı kullanıyorsanız , dosya zaman damgasını geçerli tarih ve saate günceller. Dosya yoksa, geçerli tarih ve saatte zaman damgası olarak boş bir dosya oluşturur.

viÖte yandan, yazmadığınız sürece yeni bir dosya oluşturmaz.

Örneğin, ben yazdıysam vi test.txt, bazı notlar yazdım , sonra yazdım :q!; test.txtolmazdı.


Kabul edilen cevapta açıklanan fayda nedir?
JBentley

8

Bu olmadan touch, siz viyazmayı söyleyene kadar yeni bir dosya bulunmaz .

Çok kullanıcılı bir sistem düşünün (belki de her biri birçok kullanıcıyla paylaşılan ağa bağlı bir dosya sistemindesiniz). Çalıştırılması touch, dosyaya sahip olduğunuzdan (ve ona yazabildiğinizden) emin olmanızı sağlar ve zaman damgasını bile günceller. Böyle bir dosya oluşturmak isteyen başka bir kullanıcı, size ait olduğunu görecektir. Zaten mevcutsa ve başka bir kullanıcı onu silmek veya değiştirmek istiyorsa, son zamanlarda değiştirildiğini görecek ve belki de iki kez düşüneceklerdir.


4

touchİlk olmanın bir faydası yok ; viyoksa, dosyayı oluşturacaktır.

Kabul edilen cevap, bir editörde zaman kaybetmeden önce buraya yazıp yazamayacağınızı kontrol ettiğini söylüyor. Doğru, ama şimdi touchher seferinde yazmaya zaman harcıyor olacaksın . Bir yere yazamamak, ne kadar sık ​​işe yarayacağına kıyasla oldukça istisnai bir durumdur ( sudoana dizininizin dışındaki dosyaları hatırladığınız veya /tmpkök olarak giriş yapmış olduğunuz sürece).

Sadece düzenleyiciyi açın ve istediğiniz şeyi yapın, ardından dosyayı kaydetmeyi deneyin. İşe yaramazsa bile :w!, başka bir yerde ( :w ~/asdf) kaydedin ve sorunu düzeltin. Sorun çözüldü sonra, orijinal geçici dosyadan dosya içeriğini kopyalayabilirsiniz: cat ~/asdf > /mnt/example.txt && rm ~/asdf. Kullandığımız nedeni catyerine mvveya cpyerlerine ait izinler ve diğer özelliklerini kullanmaktır.

Dahası, bazı daha gelişmiş komut satırı kullanımları için, sorunu giderirken (ya da ya da ya da ) sorununuzu çözerken + viile arka plan ve son olarak write komutunu çalıştırmak için tekrar kullanabilirsiniz.CtrlZ:suspend:susfg

Düzenleme: / u / G-Man'ın yorumlarına yanıt olarak yayın iyileştirildi . Teşekkürler!


3
Bazı güvenlik sorunları burada vardır: Dosya varsa (1) /mnt/example.txtdünyaca okunabilir olması gerekiyordu değildir, ancak sizin umask'ı 22 gibi keyfi bir şeye ayarlandığında, daha sonra /tmp/asdf olacak dünya okunabilir. Sistemde başka insanlar varsa, dosyanın geçici kopyasını okuyabilirler. (2) Dosya /mnt/example.txtmuhtemelen dünyaya yazılabilir olmamalı, ancak sistemde kötü niyetli insanlar varsa, dosyanın geçici kopyasını okuyabilir ve taşımadan / kopyalamadan önce değiştirilmiş bir sürümle değiştirebilirler. doğru yere geri dönün.   … (Devamı)
G-Man

3
(Devam))… (Yapışkan bitin açılması /tmpbunu önleyebilir.) (3) Komut mv /tmp/asdf /mnt/example.txtakımı tamamen yok edecek /mnt/example.txtve onunla değiştirecektir /tmp/asdf. Değiştirmek istediğiniz içeriği arasında /mnt/example.txtolan içeriğin ait /tmp/asdf. Kullanarak mv, kurmak /mnt/example.txtaynı olması özelliklerini olarak /tmp/asdfmuhtemelen sizin ve dünya okunabilir aittir -. Daha iyi, cp /tmp/asdf /mnt/example.txthatta daha iyi olabilir cat /tmp/asdf > /mnt/example.txt. … PS (4) viYazarak askıya alabilirsiniz :suspend(veya :suskısaca).
G-Man

@ G-Man Bunlar iyi noktalar. İçinde bulunduğu 5 dakika boyunca bir dosyayı çalmaktan özellikle korkmuyorum /tmp, ama ~/bunun yerine yazmamak için hiçbir sebep yok . Ayrıca bunun niteliklerin yerini alacağını düşünmemiştim. Mesajımı düzenleyeceğim, teşekkürler :)
Luc

3

Avantaj yok. viyoksa bir dosya oluşturacaktır.


1

vi görsel bir metin editörüdür (vi = visual) Yine de "ed" e kıyasla görseldir; bu, bir kerede yalnızca bir satır metin görmenizi ve değiştirmenizi sağlar.

touchKomutu, varolan dosya üzerinde damgası günceller veya dosya zaten olmasaydı yeni bir dosya oluşturur. Zaman damgalarına büyük ölçüde bağımlı olan şeyleri test etmek için iyidir.

Şimdi, eğer dosyanız bir metin dosyasıysa veya henüz mevcut değilse, vi ile açıp vi komutunu :wqvermek, o dosyaya dokunmakla aynı sonucu verecektir. İki komutun benzer olmasının tek yolu bu.


1

Özellikle birlikte kullanılmak üzere vi, orada düzenlemeden önce dosya oluşturmak gerek yoktur: viyeni bir dosya oluşturmak ve kaydetmek için kullanılabilir. Ancak, dosyanın bulunması gereken arama bağlamları vardır. Örneğin, sistemimde (OS X) şöyle bir uygun bir GUI editörü (dosya türüne göre) başlatabilirim:

open foo.txt

Bu foo.txt, TextEdit'te veya emacs'de veya metin dosyaları için tercih editörüm olarak belirttiğim her ne olursa olsun açılacak ve derhal geri dönmem için işlemi keseceğim. ( open bar.pyIDLE, python editöründe açabilir; vb.) Veya açıkça emacs isteyebilirim:

open -a emacs foo.txt

Ancak open, dosyanın zaten var olmasını gerektirir, aksi halde hata oluşturur. Bu yüzden , olmasa bile GUI'yi başlatmak emacsiçin yazmama izin veren aşağıdaki kabuk işlevi olarak tanımlamam gerekiyordu .emacs fooemacsfoo

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

0

vi bir dosyayı kullanıcı olarak düzenlemek için kullanılırken, dokunma üzerindeki zaman damgasını ayarlayabilir ve çoğunlukla komut dosyalarında kullanılır.

Dosya oluşturmanın başka bir yolu:

>newfile.txt

1
Bu güvenilmezdir, çünkü POSIX belirtiminde belirtilen (afaik) değildir. Örneğin, zshIn'de aynıdır cat >newfile.txtve Ctrl + D tuşlarına basmanız gerekir.
Adam Katz

@AdamKatz iyi nokta; Cevabını güncelledim, tavsiyen için teşekkürler.
James Youngman,

0

Man sayfa dokunarak birincil işi dosya zaman damgalarını değiştirmek.
Ofc ayrıca geçerli zaman damgası ile dosya oluşturuyor ve sonra dosyayı düzenleyebilirsiniz.

VI, metin düzenleme açık, kaydetme, dosyayı düzenleme vb. Söylediklerini yapan bir metin editörüdür.

Hepsi kullanıcının ve alışkanlığın tadıdır: sonra dokunma vi ya da vi file.txt aynı şey farklı renkte.


0

touch komut , geçerli zaman damgasıyla bir dosyanın tarihini ve saatini değiştirir.
dosya yoksa, tarih ve saatle yeni dosya oluşturur.

vi Dosya mevcut değilse editör dosyaları düzenlemek için kullanılır, dosyayı kaydetmedikçe yeni bir dosya oluşturur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.