Apa kegunaan sah perintah `touch`?

83

Apa gunanya touchperintah itu? Saya tahu saya dapat membuat file kosong dengan itu, tetapi demikian juga halnya dengan echo -n.

Kalau tidak, mengapa seseorang perlu mengubah cap waktu suatu file? Kecuali untuk membuat kesan salah tentang usia file, saya tidak melihat penggunaan lain, dan ini bukan yang sah (dari sudut pandang saya).

Feora Quora
sumber
15
alih-alih echo -n > filename, Anda dapat menjalankan yang berikut ini:>filename
AMADANON Inc.
77
Apa kegunaan yang tidak sah ?
bmargulies
10
Unless to create the false impression about the age of a file. Tidak perlu kesan salah. Bagaimana jika Anda ingin mengubah waktu modifikasi? Ini bisa berguna dalam skrip. Script ini sangat tergantung pada touchperintah dan sangat mudah dan sederhana untuk memilikinya seperti itu.
VL-80
7
Pertimbangkan apa tar(atau pengarsipan lainnya) lakukan ketika mereka mengekstrak arsip. Umumnya mereka mengatur waktu modifikasi file ke waktu dari arsip, bukan waktu arsip diekstraksi, dan ini adalah fitur yang diinginkan. Karena sah untuk program mode pengguna untuk membuat cap waktu palsu, tidak ada banyak argumen mengapa touch(atau program baris perintah lainnya) tidak boleh mengizinkannya berdasarkan argumen baris perintah. Belajar C tidak membuat Anda lebih sah daripada seseorang yang menulis shnaskah ;-)
Steve Jessop
5
Di unix, tidak ada cap waktu yang menjelaskan agetentang suatu file. Itu akan menjadi creationtimestamp dan tidak ada timestamp untuk file di unix.
Kevin Fegan

Jawaban:

98

Salah satu keuntungannya touchadalah dapat menentukan stempel waktu sewenang-wenang, sementara echo -nakan selalu menghasilkan waktu saat ini.

Contoh penggunaan yang sah adalah untuk memperbarui stempel waktu dari file kode sumber sehingga program seperti makeakan mempertimbangkan file sumber lebih baru dari objek yang dikompilasi dan membangunnya kembali.

Kegunaan lain adalah untuk membuat file yang berfungsi semata-mata berdasarkan keberadaannya misalnya /etc/nologin, yang melarang login jika ada. Saya juga berpendapat bahwa itu touch myfileadalah konstruksi yang lebih sederhana daripada echo -n >> myfile, juga lebih pendek untuk mengetik.

casey
sumber
18
penggunaan umum lainnya: sentuh file ke tanggal tertentu, lalu "find / -newer / the / file" untuk menemukan semua file diubah / dibuat setelahnya
Olivier Dulac
@casey Ketika saya memeriksa dokumentasi echo -nsaya melihat bahwa ia mengatakan "jangan output baris baru". Jadi saya tidak melihat bagaimana ini bisa membuat file kosong. Bisakah Anda mengklarifikasi?
Geek
3
@ Geek echo -nakan menampilkan string kosong, dan dengan sendirinya tidak melakukan apa pun. Mengarahkan output melalui >>menyebabkan output kosong ditambahkan ke file. Pengalihan akan menyebabkan file dibuat jika file tidak ada.
Casey
6
Itu tidak berfungsi: membuka file yang sudah ada untuk output, tetapi tidak menulisnya, tidak mengubah waktu (pada sistem saya, lagi pula). Bahkan jika itu terjadi, Anda tidak perlu dan tidak boleh menggunakan echo -nuntuk perintah yang tidak melakukan apa pun. echo -ndapat menampilkan string "-n" di bawah beberapa shell. Jika Anda benar-benar membutuhkan perintah yang tidak melakukan apa-apa, :atau truemerupakan opsi yang lebih baik, tetapi >> myfiledengan sendirinya juga merupakan cara yang sah untuk membuat file jika tidak ada. Semua ini, tentu saja, mendukung jawaban Anda bahwa Anda hanya perlu menggunakan "sentuhan".
hvd
40

Panggilan sistem yang mendasarinya ( utime) penting untuk berbagai utilitas seperti taruntuk dapat mengatur stempel waktu dari file yang baru disalin (tidak ter-tar). Beberapa utilitas cadangan juga dapat dipilih untuk mengatur ulang waktu akses terakhir dari file yang telah mereka salin.

Salah satu penggunaan sah touchadalah untuk membuat file dengan cap waktu tertentu. File "referensi" seperti itu kemudian dapat digunakan oleh perintah seperti find. Misalnya, untuk menemukan semua file yang lebih baru dimodifikasi daripada 1 November 2013 (mis. 2013/11/01) "

touch -amt 201311010000 myref
find . -type f -newer myref -exec ls -ld {} +
JRFerguson
sumber
Bagaimana cara menghitung itu 201311010000 berarti 1 November 2013? Apakah ada utilitas yang akan memberi tahu saya hal ini? Dengan kata lain bagaimana cara menentukan input yang akan disentuh?
Geek
4
@Geek Dengan melihat nomor dan mencatat bahwa bagian pertama 20131101,, dapat dipecah menjadi 2013-11-01, atau 1 November 2013. Anda kemudian dapat mengasumsikan bahwa 0000bagian tersebut menunjukkan waktu tertentu dalam sehari, dalam hal ini 00 jam, 00 menit. Atau Anda bisa melihat halaman manual untuk touch, yang memberitahu Anda apa formatnya (lihat -t).
JAB
@Geek Halaman manual adalah teman Anda :-)
JRFerguson
39

The touchTujuan utama perintah ini adalah memanipulasi cap waktu file, dan untuk membuat file.

Contohnya

1. membuat file

$ 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

CATATAN: The total 0Output dari ls -lbenar. Implementasi ini lsmenunjukkan jumlah blok yang digunakan oleh file ketika mereka terdaftar. Anda dapat meyakinkan diri sendiri tentang fakta ini dengan menambahkan -speralihan ke ls. Ini akan mencantumkan blok yang digunakan oleh setiap file. Di sini saya telah menambahkan 2 karakter ke file1 & file2.

Contoh

$ 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. info waktu / tanggal suatu file - perintah 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: -

Kita dapat menggunakan touchuntuk memanipulasi berbagai cap waktu pada file yang diberikan.

3. kutipan dari halaman manual sentuh

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

4. memanipulasi waktu akses

$ 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. memanipulasi waktu modifikasi

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

Anda mungkin bertanya-tanya tentang waktu perubahan (waktu). Itu tidak bisa dimanipulasi menggunakan touch. Itu melacak waktu salah satu data meta disentuh pada file. Lihat U&L T&J ini untuk perincian lebih lanjut, berjudul: Apa yang dapat Anda lakukan pada file tanpa memicu cap waktu "Ubah"? .

slm
sumber
@sim: pertanyaan saya menyiratkan bahwa saya tahu sentuhan itu untuk mengubah cap waktu. Saya hanya ingin tahu mengapa pengguna yang jujur ​​menginginkan itu. Jika bukan karena bagian waktu dari jawaban Anda, saya telah memberi Anda -1.
Quora Feans
16
@QuoraFea - jawaban saya adalah untuk keuntungan Anda dan pengguna yang pernah menemukannya di masa depan. Tolong jangan berasumsi bahwa jawaban adalah murni untuk Anda dan saya minta maaf jika saya menyinggung Anda dengan cara apa pun, itu bukan maksud saya, saya hanya berusaha menjelaskan dasar-dasar bagaimana waktu bekerja.
slm
@sim: Saya tidak tersinggung, hanya berpikir jawabannya tidak berjalan ke arah yang benar. Bagaimanapun, terima kasih atas jawaban ini.
Quora Feans
@QuoraFea - sama-sama, dan terima kasih atas Q. Terima kasih!
slm
1
@Geek - coba perintahnya. Itu adalah output yang benar dari ls -ldalam direktori di mana file memiliki ukuran 0, dan belum ada yang lain. Segera setelah Anda memberikan salah satu ukuran file maka total akan muncul dengan jumlah blok yang digunakan oleh file. Lihat pembaruan saya jika Anda tidak yakin, saya telah menambahkan contoh.
slm
20

Terlepas dari dua jawaban lain yang sangat baik yang Anda dapatkan, namun kegunaan lain adalah, dalam kata-kata Anda, untuk

buat kesan palsu tentang usia file

misalnya untuk digunakan dalam skema cadangan . Anda mungkin ingin tidak memperbarui cadangan dengan yang lebih baru karena identik, atau karena perubahan tidak relevan dibandingkan dengan biaya memperbarui cadangan pada, katakanlah, garis lambat ke host jarak jauh. Untuk mencapai ini, Anda memiliki opsi sederhana untuk menandai file cadangan dengan stempel waktu yang lebih baru, bukan berpura - pura tetapi menyatakan bahwa stempel waktu validitas file itu sekarang berbeda.

Kesan tentang usia file sekarang memang salah, tetapi maknanya nyata dan sah.

LSerni
sumber
20

Salah satu penggunaan yang paling umum touchadalah - atau paling tidak dulu - untuk memicu pembangunan kembali kode.

Alat bangun biasa - makedan turunannya - mencoba untuk menyimpan pekerjaan dengan tidak mengkompilasi ulang / membangun kembali file kecuali salah satu file yang dibuat telah berubah - misalnya, jika file .o lebih baru daripada .c sumber, biasanya aman untuk menganggap bahwa sumber C tidak berubah sejak dikompilasi untuk menghasilkan file objek.

Tetapi ada kalanya Anda ingin memaksa sesuatu untuk dibangun kembali. Anda dapat membuat modifikasi yang tidak perlu ke salah satu file sumbernya, tetapi itu berisiko merusak sesuatu secara tidak sengaja. Sebagai gantinya, Anda dapat dengan mudah touchmembuat file tersebut, menjadikannya tampak baru tanpa risiko mengubah kontennya - dan itu sudah cukup untuk meyakinkan makebahwa sudah waktunya untuk membangun kembali semua yang tergantung pada file itu.

Ada kegunaan lain, tetapi secara historis itu yang besar.

keshlam
sumber
Meskipun ada ide bagus untuk mengubah file yang menyebabkan pembangunan kembali, saya akan membantahnya. Beberapa sistem revisi kode sumber dapat menjadi bingung tentang file yang diubah. Begitu touchjuga dengan perubahan manual. Untuk menyebabkan pembangunan kembali, saya sarankan menghapus file output .odari sumber yang dimaksud.
pemain
1
Perubahan manual dan penghapusan file .o keduanya membutuhkan lebih banyak waktu dan pengetikan, dan perubahan manual jauh lebih rentan kesalahan. Dan kita hanya berbicara tentang memodifikasi stempel waktu pada copy yang berfungsi - jika pengeditan dilakukan sesudahnya, file akan dengan benar mencerminkan stempel waktu perubahan. Dan tidak semua sistem kontrol versi dikacaukan oleh stempel waktu.
David
1
Seperti kata David. Ini benar-benar adalah praktik Unix standar belum lama ini, dan masih tetap praktik standar untuk pengembang yang bekerja di luar IDE.
keshlam
12

Saya telah bekerja dengan setidaknya satu kerangka kerja web (tidak ingat yang mana) yang dalam mode pengembangan menyaksikan file kode sumber untuk perubahan dan memuat ulang aplikasi ketika itu terjadi.

Tentu saja kadang-kadang Anda ingin memuat ulang setelah mengubah sesuatu yang tidak ditonton, dalam hal touchini file konfigurasi utamanya melakukan trik.

Jadi, dalam kasus umum, setiap kali Anda ingin memulai proses yang dipicu oleh perubahan pada file, tanpa benar-benar mengubah file.

millimoose
sumber
4
Ini sebenarnya adalah kasus dengan mod_wsgi dan apache; Anda dapat memuat ulang, misalnya, aplikasi web Django hanya dengan menyentuh file wsgi.
sapi
11

Penggunaan sentuhan yang sah:

  • Perbarui cap waktu file gambar (GIF / JPG / etc) hingga waktu diambil. Tidak semua pemberi render membaca atau mengindahkan informasi EXIF.
  • Pertahankan waktu c / m saat memperbarui kumpulan file secara massal di mana stempel waktu penting untuk bundel file.
  • Setel waktu file batch (yaitu CSV) jika Anda perlu melakukan impor lain setelah kegagalan, dan program impor tergantung pada cap waktu (biarkan diskusi itu ke topik lain :-))
  • Tujuan pengarsipan, yaitu mencadangkan di folder berdasarkan tahun, lalu mengatur waktu di folder ini hingga 1 Jan YYYY untuk memudahkan penyortiran
sastorsl
sumber
7

Satu kegunaan adalah untuk memperbaiki timestamp file yang tidak semestinya diatur.

Sebagai contoh, sebagian besar cara Anda menyalin file (dan untuk beberapa cara Anda dapat memindahkan file) menghasilkan file baru memiliki timestamp waktu saat ini, bukan timestamp dari file asli.

Biasanya, ini bukan yang diinginkan. Sentuhan dapat "memperbaiki" itu.

Penggunaan lain adalah untuk mencerminkan modifikasi file yang dibatalkan dengan mengembalikan stempel waktu file ke apa itu sebelum operasi "edit ... undo-edit".

Kevin Fegan
sumber
2
Memang. Melalui waktu saya telah menemukan alias cp='cp --preserve=timestamps'lebih cocok untuk saya di tanah PC ...
Runium
5

Perbedaan penting vs. thingssuka echo(atau yang lebih baik > fileseperti yang disebutkan oleh orang lain) adalah sentuhan tidak akan menghancurkan konten. > fileakan mengosongkan file. touchtidak akan. Alih-alih memikirkan trik untuk menghindari kerusakan konten, cukup gunakan sentuhan! Lagipula ia akan bekerja lebih sedikit di kernel, karena ia hanya akan bekerja dengan atribut-atribut file tanpa membuang waktu untuk mempersiapkan pembukaan dan kemudian melakukan penutupan.

Sentuhan mungkin dapat mengubah stempel waktu meskipun file saat ini berada di bawah kunci wajib atau penasihat, atau pembukaan eksklusif. Hmmm, belum pernah diuji atau baca tentang itu ...


sumber
2
>>akan menambahkan alih-alih menimpa
Michael Mrozek
Saya mempertimbangkan untuk menyebutkan hal itu, tetapi semakin masuk ke wilayah efek samping. Anda juga harus menyebutkan fakta bahwa itu akan menimbulkan kesalahan jika file tersebut sudah dibuka secara eksklusif, dll. Dll. Masalah yang dapat diterapkan melalui penggunaan> juga. Saya kira poin sekunder saya - di luar yang utama adalah sedikit lebih cepat untuk hanya menyentuh statistik file - adalah bahwa itu adalah ide yang baik untuk menulis kode yang mengatakannya langsung, daripada berbelit-belit.
4

Ini salah satunya - saya menggunakan program perangkat lunak yang disebut SageTV untuk merekam acara TV - ini sering direkam dalam MPEG-2 yang bukan codec yang sangat efisien, juga tidak ramah iPad / iPhone. Jadi saya mengonversi file ke file .mp4. Tetapi ketika memutar file, SageTV mengharapkan timestamp file tersebut menjadi saat acara TV dimulai - jika tidak, skrup waktu timeline acara tidak mudah untuk FF atau REW. Oleh karena itu saya menggunakan sentuhan untuk mengatur ulang stempel waktu dari file .mp4 agar sama dengan file orignal.
Apakah itu sah?

Wayner
sumber
2

Seringkali Anda mungkin memiliki proses yang berubah dari userid, seperti dari root -> sesuatu yang lain. Sentuh dapat memberi Anda kesempatan untuk membuat file di tempat yang hanya dapat disentuh oleh root sebelum aplikasi mulai masuk ke file tersebut sebagai pengguna lain.

pengguna56560
sumber
Itu bukan penggunaan sentuhan yang tidak dapat diraih oleh "echo" - lihat pertanyaan asli penulis
Domingo Ignacio Galdos
Echo melibatkan pembukaan aliran dan semacamnya. Sentuhan dapat dioptimalkan secara hiper dengan bekerja langsung dengan inode. KINERJA FTW!
user56560
2

Di tempat kerja kami memiliki arsip peta digital yang berusia 15 tahun ke belakang. Peta-peta lama ini disimpan dalam berbagai format seperti PostScript, EMF, PRN, hpgl2, pdf, dll. Yang sebagian besar program tidak mengerti. Atau Anda perlu selusin program berbeda untuk melihat semuanya.

Untuk memudahkan pencarian dan penelusuran semua format yang berbeda ini kami membuat versi peta jpeg, dan kemudian menggunakan sentuhan untuk membuat file jpeg cocok dengan stempel waktu file sumber asli - seringkali bertahun-tahun setelah yang asli dibuat.

Sekarang kita dapat menggunakan satu program seperti Picasa untuk melihat seluruh pustaka dan dengan mudah menemukan rentang tanggal tertentu. Tanpa sentuhan kita harus menambahkan metadata tanggal untuk setiap gambar tunggal, mungkin secara manual, dan kemudian mencari string itu ketika mencari rentang tanggal tertentu.

matt wilkie
sumber
1

Saya belum menggunakannya untuk tujuan ini, tetapi saya memiliki skrip yang membaca file dan tanggalnya dari direktori dan membacanya untuk digunakan pada halaman web. Jika saya harus mengedit satu, itu akan mengubah tanggalnya. Saya telah mempertimbangkan touchmereka untuk mengatur ulang pesanan mereka.

TecBrat
sumber
1

Beberapa skrip init membandingkan cap waktu file konfigurasi dengan file pid mereka sendiri. Hasilnya memutuskan apakah akan memuat ulang layanan yang sedang berjalan atau tidak.

Jika ada situasi di mana Anda tidak ingin mengubah konfigurasi tetapi ingin memaksa memuat ulang, sentuh membantu Anda di sini.

Nils
sumber
0

Saya memiliki pekerjaan cron yang mendapatkan perubahan dari database yang telah terjadi antara menjalankan pekerjaan terakhir, dan menjalankan saat ini. Ini menghasilkan file XML dari perubahan yang kemudian diolah menjadi database yang berbeda. Ini mendapatkan waktu menjalankan terakhir dari cap waktu pada file output XML. *

Jika ada yang salah dalam pemrosesan file XML, saya mungkin ingin mengulangi proses dari tanggal asli, bukan dari tanggal yang disebutkan pada cap waktu file XML baru.

Cara paling sederhana untuk melakukan ini, daripada mengedit skrip yang disebut dll adalah menyentuh file XML dan memaksa cap waktu menjadi tanggal yang saya butuhkan.

Juga jika saya mulai dari awal (tanpa file output XML sebelumnya) saya hanya dapat mensimulasikan keberadaannya menggunakan sentuhan.

[*] Sebelum seseorang menunjukkannya - saya menyadari saat pekerjaan dimulai dan penulisan file XML menyisakan jarak waktu beberapa menit di mana perubahan DB dapat terjadi. Pekerjaan berjalan pada saat perubahan DB sangat tidak mungkin. Itu alasan saya dan saya berpegang teguh pada itu :-)

Geeb
sumber