"Dokunma" komutunun meşru kullanımları nelerdir?


83

touchKomutun amacı ne ? Onunla boş dosyalar oluşturabileceğimi biliyorum, ancak durum böyle echo -n.

Aksi halde, neden bir dosyanın zaman damgasını değiştirmesi gerekiyor? Bir dosyanın yaşı hakkında yanlış izlenim yaratmadıkça, başka bir kullanım göremiyorum ve bu meşru değil (benim bakış açımdan).


15
yerine echo -n > filename: aşağıdaki çalıştırabilirsiniz>filename
AMADANON Inc.

77
Nelerdir gayrimeşru kullanımları?
bmargulies

10
Unless to create the false impression about the age of a file. Gerekli olmayan yanlış izlenim. Değişiklik zamanını değiştirmek istiyorsanız ne yapmalıyım ? Scriptlerde faydalı olabilir. Bu betik ağır touchkomuta bağlıdır ve böyle olması çok kolay ve basittir.
VL-80

7
tarBir arşivi çıkardıklarında (veya diğer arşivleyicilerin) ne yaptığını düşünün . Genellikle, dosyanın değiştirilme zamanını, arşivin çıkarıldığı zamana değil, arşivdeki zamana ayarlarlar ve bu arzu edilen bir özelliktir. Bir kullanıcı modu programının yanlış zaman damgaları oluşturması meşru olduğundan, neden touch(veya başka bir komut satırı programının) komut satırı argümanına dayanarak izin vermemesi gerektiği konusunda fazla bir tartışma yoktur. C'yi öğrenmek sizi shsenaryo yazan birinden daha meşru kılmaz ;-)
Steve Jessop

5
Unix'te, agebir dosyayı tanımlayan zaman damgası yoktur . Bu bir creationzaman damgası olurdu ve unix'teki dosyalar için böyle bir zaman damgası olmaz.
Kevin Fegan

Yanıtlar:


98

Bunun bir avantajı, her zaman geçerli zamanla sonuçlanırken touch, isteğe bağlı zaman damgaları belirtebilmesidir echo -n.

Meşru bir kullanım örneği, bir kaynak kod dosyasının zaman damgasını güncellemektir, böylece bir program makekaynak dosyayı derlenmiş nesnesinden daha yeni olarak değerlendirir ve yeniden oluşturur.

Diğer kullanımlar, yalnızca varoluşlarına göre çalışan dosyaları oluşturmaktır; örneğin /etc/nologin, eğer varsa girişleri engeller. Ayrıca yazmanın touch myfiledaha echo -n >> myfilekısa olmasının yanı sıra daha basit bir yapı olduğunu da savunuyorum .


18
başka bir yaygın kullanım: belirli bir tarihe bir dosyaya dokunun, daha sonra değiştirilen / oluşturulan tüm dosyaları bulmak için "/ /newer / the / file" komutunu bulun
Olivier Dulac

@casey Belgelerini kontrol echo -nettiğimde, "izleyen yeni satırı çıkarmayın" yazdığını görüyorum. Yani bunun nasıl boş bir dosya oluşturabildiğini göremiyorum. Lütfen açıklayabilir misin?
Geek

3
@Geek echo -nboş bir dizge çıkarır ve kendi başına hiçbir şey yapmaz. Çıktısını yeniden yönlendirmek >>, boş çıkışın bir dosyaya eklenmesine neden olur. Yeniden yönlendirme, dosya yoksa dosyanın oluşturulmasına neden olur.
casey

6
Bu işe yaramıyor: çıktı için mevcut bir dosyayı açmak, ancak üzerine yazmak değil, mtime değişmez (benim sistemimde, zaten). Olsa bile echo -n, hiçbir şey yapmayan bir komut için kullanmanıza gerek kalmaz. echo -nbazı kabukları altında "-n" dizesini çıkartabilir. Gerçekten hiçbir şey yapmayan :veya truedaha iyi bir seçenek olan bir komuta ihtiyacınız varsa , ancak >> myfilekendiliğinden, yoksa yoksa dosyayı oluşturmak için de geçerli bir yoldur. Tüm bunlar elbette, sadece "dokunuş" kullanmanız gerektiği yönündeki cevabınızı destekliyor.
HVD

40

Temel sistem çağrısı ( utime), taryeni kopyalanan (taranmamış) bir dosyanın zaman damgalarını ayarlayabilmek gibi çeşitli yardımcı programlar için önemlidir . Bazı yedekleme yardımcı programları, kopyaladıkları dosyaların son erişim zamanlarını sıfırlamak için de seçilebilir.

Meşru kullanımlarından biri touch, belirli bir zaman damgasına sahip bir dosya oluşturmaktır. Böyle bir "referans" dosyası daha sonra gibi komutlar tarafından kullanılabilir find. Örneğin, 1 Kasım 2013'ten daha yeni değiştirilmiş tüm dosyaları bulmak için (ör. 2013/11/01) "

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

Bu nasıl hesaplanır 201311010000 Nov1,2013 anlamına gelir? Bunu bana söyleyecek bir yardımcı var mı? Başka bir deyişle, dokunacak girişi nasıl belirleyebilirim?
Geek

4
@Geek Sayıya bakarak ve ilk kısmın, 20131101parçalanabileceğini 2013-11-01veya 1 Kasım 2013'e ayrılabileceğini belirterek. Daha sonra 0000parçanın günün belirli bir zamanını, bu durumda 00 saat, 00 dakika olduğunu gösterdiğini varsayabilirsiniz . Veya touchformatın ne olduğunu tam olarak anlatan man sayfasına bakabilirsiniz -t.
JAB

@Geek Manpages arkadaşınız :-)
JRFerguson

39

touchKomutunun birincil amacı dosyaların zaman manipüle ve dosyaları oluşturmak için bir.

Örnekler

1. dosya oluşturma

$ 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

NOT:total 0 çıktısı ls -ldoğrudur. Bu uygulama, lslistelendiğinde dosyalar tarafından kullanılan blok sayısını gösterir. -sDüğmeyi ekleyerek kendinizi bu gerçeğe güvence altına alabilirsiniz ls. Bu, her bir dosya tarafından kullanılan blokları listeler. Burada dosya1 ve dosya2'ye 2 karakter ekledim.

Örnek

$ 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. bir dosyanın zaman / tarih bilgisi - stat komutu

$ 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: -

touchBelirli bir dosyadaki çeşitli zaman damgalarını değiştirmek için kullanabiliriz .

3. dokunmatik adam sayfasından alıntı

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

4. erişim zamanını değiştirmek

$ 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. değişiklik zamanını değiştirin

$ 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: -

Değişim zamanını merak ediyor olabilirsiniz (ctime). Bu kullanılarak manipüle edilemez touch. Bu, herhangi bir meta verinin dosyaya dokunulduğu süreyi izler. Daha fazla ayrıntı için bu U&L Soru ve Cevaplarına bakınız: "Change" Timestamp'i tetiklemeden bir dosyaya ne yapabilirsiniz? .


@sim: Sorum şu ki, dokunuşun zaman damgalarını değiştirmek için olduğunu biliyorum. Sadece dürüst bir kullanıcının neden bunu istediğini bilmek istedim. Cevabınızın ctime kısmı olmasaydı, size bir -1 vermişti.
Quora,

16
@QuoraFea - Cevabım sizin yararınıza ve gelecekte karşılaşabileceği kullanıcılara yöneliktir. Lütfen bir cevabın sizin iyiliğiniz için olduğunu varsaymayın ve sizi herhangi bir şekilde rahatsız ettiğim için özür dilerim, niyetim değildi, sadece zamanın nasıl çalıştığının temelini açıklamaya çalışıyordum.
slm

@sim: Kırılmadım, cevabın doğru yöne gitmediğini düşündüm. Neyse, bu cevap için teşekkürler.
Quora

@QuoraFea - oldukça rica ederim ve Q'nuz için teşekkür ederiz.
slm

1
@Geek - komutları deneyin. Bu, ls -ldosyaların 0 boyuta sahip olduğu ve henüz başka hiçbir şeyin bulunmadığı bir dizinden alınan doğru çıktıdır . Dosya boyutlarından birini verir vermez, toplam, dosyalar tarafından kullanılan blokların miktarını gösterir. Emin değilseniz güncellemelerime bakın, bir örnek ekledim.
slm

20

Diğer iki çok iyi cevabın yanı sıra, bir başka ifadeyle, sizin sözünüzle,

Bir dosyanın yaşı hakkında yanlış izlenim yaratmak

Örneğin, yedekleme şemalarında kullanım içindir . Aynı olduklarından veya değişikliklerin uzaktaki bir ana bilgisayara yapılan yavaş bir satırda bir güncelleme yapılmasının masrafı ile karşılaştırıldığında, aynı olmaları nedeniyle ya da değişikliklerin alakasız olmasından dolayı bir yedeği güncellemek istemeyebilirsiniz. Bunu başarmak için, daha yeni bir zaman damgası ile yedekleme dosyası işaretleme değil basit bir yolu var numara ama beyan o dosyanın geçerliliği zaman damgası artık farklı biri olduğunu.

Dosyanın yaşı hakkındaki izlenim şimdi gerçekten yanlıştır, ancak anlamı gerçek ve meşrudur.


20

En yaygın kullanım alanlarından touchbiri - veya en azından eskiden - kullanılan kodun yeniden oluşturulmasıdır.

Her zamanki derleme araçları - makeve türevleri - dosyaları oluşturmaya giren dosyalardan biri değişmediyse, örneğin bir .o dosyası .c'den daha yeni ise kaynak, C kaynağının bu nesne dosyasını üretmek için derlendiğinden beri değişmediğini varsaymak genellikle güvenlidir.

Ancak bir şeyi yeniden inşa etmeye zorlamak istediğiniz zamanlar vardır. Kaynak dosyalarından birinde gereksiz bir değişiklik yapabilirsiniz, ancak bu, bir şeye kazara zarar verme riski taşır. Bunun yerine, touchdosyayı değiştirebilir, içeriğini değiştirme riski olmadan yeni görünmesini sağlayabilirsiniz - ve makebu dosyaya bağlı olan her şeyi yeniden oluşturmanın zamanının geldiğine ikna etmek yeterli olacaktır .

Başka kullanımları da var, ama tarihsel olarak en büyüğü buydu.


Yeniden oluşturmak için bir dosyayı değiştirmek iyi bir fikir olsa da buna karşı çıkacağım. Bazı kaynak kod revizyon sistemleri, değiştirilen bir dosya hakkında kafaları karışabilir. Yani touchmanuel bir değişim kadar kötü. Yeniden yapılanmaya neden olmak için .osöz konusu kaynağın çıktı dosyalarını silmenizi öneririm .
harper

1
El ile yapılan değişiklikler ve .o dosyalarının kaldırılması hem daha fazla zaman hem de yazmayı gerektirir ve el ile yapılan değişiklik çok daha fazla hataya açıktır. Ve yalnızca çalışan bir kopyadaki zaman damgasını değiştirmekle ilgili konuşuyoruz - düzenlemeler daha sonra yapılırsa, dosya değişiklik zaman damgasını doğru olarak yansıtır. Ve tüm sürüm kontrol sistemleri zaman damgası ile karıştırılmaz.
David

1
David'in dediği gibi. Bu gerçekten çok uzun zaman önce değil standart Unix uygulamasıydı ve hala IDE'lerin dışında çalışan geliştiriciler için standart bir uygulama olmaya devam ediyor.
keshlam

12

En az bir web çerçevesi ile çalıştım (hangisini hatırlayamıyorum), geliştirme modunda değişiklikler için kaynak kod dosyalarını izledi ve bu gerçekleştiğinde uygulamayı yeniden yükledim.

Elbette, bazen izlemeyen bir şeyi değiştirdikten sonra yeniden yüklemeyi istediniz, bu durumda touchana yapılandırma dosyası hile yaptı.

Bu nedenle, genel durumda, bir dosyayı değiştirerek tetiklenen bir işlemi başlatmak istediğinizde, aslında dosyayı değiştirmeden.


4
Bu aslında mod_wsgi ve apache ile olan durumdur; örneğin bir django web uygulamasını sadece wsgi dosyasına dokunarak yeniden yükleyebilirsiniz.
sapi

11

Dokunmanın meşru kullanımı:

  • Görüntü dosyalarının zaman damgasını (GIF / JPG / etc) alındıkları zamana göre güncelleyin. Tüm oluşturucular EXIF ​​bilgilerini okumaz veya dikkate almaz.
  • Bir grup dosyayı güncellerken, zaman damgası dosya paketi için önemli olan c / m zamanını koruyun.
  • Bir başarısızlıktan sonra başka bir içe aktarma yapmanız gerekiyorsa toplu iş (örn. CSV) dosyasının zamanını ayarlayın ve içe aktarma programı zaman damgasına bağlıdır (bu tartışmayı başka bir konuya bırakın :-))
  • Arşivleme amaçları, yani yıllara göre klasörlerdeki yedeklemeler var, ardından bu klasörlerdeki zamanı kolay sıralama için 1 Ocak YYYY olarak ayarlayın.

7

Bir kullanım, yanlış ayarlanmış bir dosyanın zaman damgasını düzeltmektir.

Örneğin, bir dosyayı kopyaladığınız herhangi bir yol (ve bir dosyayı taşıyabileceğiniz bazı yollar için), yeni dosyanın orijinal dosyanın zaman damgası yerine geçerli zamanın zaman damgasına sahip olmasına yol açar.

Genellikle, istenen bu değildir. Dokun "bunu düzeltebilir".

Diğer bir kullanım, dosya zaman damgasını "edit ... undo-edit" işlemlerinden önceki haliyle geri yükleyerek yapılan bir dosya değişikliğini yansıtmaktır.


2
Aslında. Bulduğum zaman alias cp='cp --preserve=timestamps', PC ülkesinde benim için daha uygun…
Runium

5

thingsGibi echo(veya > filebaşkaları tarafından bahsedildiği gibi daha iyisi) karşı önemli bir fark , dokunuşun içerikleri parçalamamasıdır. > filebir dosyayı boşaltacaktır. toucholmaz. İçeriğin zarar görmesini önlemek için püf noktaları düşünmek yerine, sadece dokunuş kullanın! Zaten çekirdekte daha az çalışacak, çünkü sadece açılmak için hazırlık yapıp kapanış yapmak için zaman kaybetmeden sadece dosyanın öznitelikleriyle çalışacak.

Dokunma, dosya şu anda zorunlu ya da danışma amaçlı bir kilit altında veya özel bir açık durumda olsa bile muhtemelen zaman damgasını değiştirebilir. Hmmm, hiç test etmedim ya da okumamıştım ...


2
>>üzerine yazmak yerine eklenecek
Michael Mrozek

Bunu söylemeyi düşünmüştüm, ancak bu daha fazla yan etki alanına giriyor. Dosya zaten özel olarak açılmışsa, vb. Varsa, bunun bir hataya yol açacağını da belirtmelisiniz.> Kullanımıyla da uygulanabilecek bir sorun. Sanırım ikincil noktam - birincil olanın ötesinde, yalnızca dosyanın istatistiklerine dokunmanın marjinal olarak daha hızlı olması - çalının etrafına atmak yerine, onu doğrudan söyleyen bir kod yazmak için iyi bir fikir.

4

Birincisi - TV programlarını kaydetmek için SageTV adında bir yazılım programı kullanıyorum - bunlar genellikle MPEG-2'de kaydedilmiş ve çok verimli bir kodlayıcı değil, aynı zamanda iPad / iPhone dostu da değil. Bu yüzden dosyaları .mp4 dosyalarına dönüştürüyorum. Ancak, dosyaları oynatırken SageTV, TV şovunun başladığı zamandaki dosyanın zaman damgasını beklemektedir - şovun zaman çizelgesini FF ya da REW'ye kolay hale getirmeyecek şekilde mahveder. Bu nedenle, .mp4 dosyasının zaman damgasını orignal dosya ile aynı olacak şekilde sıfırlamak için dokunma kullanıyorum.
Bu yasal mı?


2

Genellikle, root -> gibi başka bir şeyden, kullanıcı kimliğinden farklı bir süreç olabilir. Dokunma, uygulama diğer kullanıcı olarak oturum açmaya başlamadan önce yalnızca kökün dokunabileceği bir yerde dosya oluşturma şansı verebilir.


Bu, "eko" tarafından ulaşılamayan bir dokunuş kullanımı değildir - yazarın orijinal sorusuna bakın
Domingo Ignacio Galdos

Yankı, bir dere açılmasını içerir ve böyle. Dokunma, doğrudan inode'larla çalışarak hiper optimize edilebilir. PERFORMANS FTW!
user56560

2

İşte 15 yıl öncesine dayanan dijital haritalar arşivimiz var. Bu eski haritalar, çoğu programın anlamadığı PostScript, EMF, PRN, hpgl2, pdf vb. Çeşitli biçimlerde kaydedilir. Veya hepsini görmek için bir düzine farklı programa ihtiyacınız var.

Tüm bu farklı biçimlerin kolayca aranmasını ve taranmasını kolaylaştırmak için, haritaların jpeg sürümlerini oluşturuyoruz ve ardından jpeg dosyasının orijinal kaynak dosya zaman damgasıyla (genellikle orijinalin yapılmasından yıllar sonra) eşleşmesini sağlamak için dokunuş kullanıyoruz.

Artık tüm kütüphaneyi görmek ve bazı tarih aralıklarını önemsiz olarak bulmak için Picasa gibi tek bir program kullanabiliriz. Dokunmadan, her bir görüntü için muhtemelen muhtemelen manuel olarak tarih meta verileri eklemek ve ardından belirli bir tarih aralığı ararken bu dizeleri aramak zorunda kalacağız.


1

Henüz bu amaç için kullanmadım, ancak dosyaları ve tarihlerini bir dizinden okuyan ve bir web sayfasında kullanım için okuyan bir komut dosyası var. Birini düzenlemek zorunda kalırsam tarihini değiştirir. touchSiparişlerini sıfırlamalarını sağlamayı düşündüm .


1

Bazı init komut dosyaları, config dosyasının zaman damgasını kendi pid dosyalarıyla karşılaştırır. Sonuç, çalışan hizmetin yeniden yüklenip yüklenmeyeceğine karar verir.

Yapılandırmayı değiştirmek istemediğiniz, ancak yeniden yüklemeyi zorlamak istediğiniz bir durum varsa, buradaki size yardımcı olur seçeneğine dokunun.


0

İşin son çalışması ile geçerli çalışma arasında oluşan bir veritabanındaki değişiklikleri alan bir cron işim var. Daha sonra farklı bir veritabanında işlenen değişikliklerin bir XML dosyasını oluşturur. XML çıktı dosyasındaki zaman damgasından son çalışma zamanını alır. *

XML dosyasının işlenmesinde herhangi bir sorun çıkarsa, çalışmayı yeni XML dosyasının zaman damgasında belirtilen tarihten itibaren değil, orijinal tarihinden itibaren tekrarlamak isteyebilirim.

Bunu yapmanın en kolay yolu, çağrılan komut dosyalarını vb. Düzenlemek yerine, XML dosyasına dokunmak ve zaman damgasını istediğim tarih olmaya zorlamaktır.

Ayrıca, yeniden başlatmaya başlarsam (önceki XML çıktı dosyası olmadan) dokunuşla varlığını basitçe simüle edebilirim.

[*] Biri dikkat çekmeden önce - işin başladığının ve XML dosyasının yazılmasının DB değişikliklerinin olabileceği birkaç dakikalık bir zaman aralığı bıraktığını anlıyorum. İş, DB değişikliklerinin son derece düşük olduğu bir zamanda çalışır. Bu benim bahanem ve buna bağlı kalıyorum :-)

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.