Việc sử dụng hợp pháp của lệnh `touch` là gì?


83

Điểm của touchlệnh là gì? Tôi biết tôi có thể tạo các tập tin trống với nó, nhưng đó cũng là trường hợp với echo -n.

Nếu không, tại sao ai đó cần phải thay đổi dấu thời gian của một tệp? Trừ khi tạo ấn tượng sai về tuổi của tệp, tôi không thấy bất kỳ mục đích sử dụng nào khác và đây không phải là cách sử dụng hợp pháp (theo quan điểm của tôi).


15
thay vì echo -n > filename, bạn có thể chạy như sau:>filename
AMADANON Inc.

77
Việc sử dụng bất hợp pháp là gì?
bmargulies

10
Unless to create the false impression about the age of a file. Không cần ấn tượng sai. Nếu bạn muốn thay đổi thời gian sửa đổi thì sao? Nó có thể hữu ích trong các kịch bản. Kịch bản này phụ thuộc rất nhiều vào touchlệnh và rất thuận tiện và đơn giản để có nó như thế.
VL-80

7
Xem xét những gì tar(hoặc các trình lưu trữ khác) làm khi họ trích xuất một kho lưu trữ. Nói chung, họ đặt thời gian sửa đổi của tệp thành thời gian từ kho lưu trữ, chứ không phải thời gian lưu trữ được trích xuất và đây là một tính năng mong muốn. Vì việc chương trình chế độ người dùng tạo ra dấu thời gian sai là không hợp lý, không có nhiều tranh cãi tại sao touch(hoặc một số chương trình dòng lệnh khác) không cho phép nó dựa trên đối số dòng lệnh. Học C không khiến bạn trở nên hợp pháp hơn ai đó viết shkịch bản ;-)
Steve Jessop

5
Trong unix, không có dấu thời gian mô tả agetệp. Đó sẽ là creationdấu thời gian và không có dấu thời gian như vậy cho các tệp trong unix.
Kevin Fegan

Câu trả lời:


98

Một lợi thế của touchnó là nó có thể chỉ định dấu thời gian tùy ý, trong khi echo -nsẽ luôn dẫn đến thời gian hiện tại.

Một ví dụ về việc sử dụng hợp pháp là cập nhật dấu thời gian của tệp mã nguồn để một chương trình như thế makesẽ xem xét tệp nguồn mới hơn đối tượng được biên dịch của nó và xây dựng lại nó.

Các cách sử dụng khác là tạo các tệp chỉ hoạt động dựa trên sự tồn tại của chúng /etc/nologin, ví dụ , không cho phép đăng nhập nếu nó tồn tại. Tôi cũng cho rằng đó touch myfilelà một cấu trúc đơn giản hơn echo -n >> myfile, cũng như ngắn hơn để gõ.


18
một cách sử dụng phổ biến khác: chạm vào một tệp đến một ngày cụ thể, sau đó "find / -newer / the / file" để tìm tất cả các tệp được thay đổi / tạo sau nó
Olivier Dulac

@casey Khi tôi kiểm tra tài liệu của echo -ntôi thấy rằng nó "không xuất ra dòng mới". Vì vậy, tôi không thấy làm thế nào điều này có thể tạo ra một tập tin trống. Bạn có thể làm rõ?
Geek

3
@Geek echo -nsẽ xuất ra một chuỗi rỗng và tự nó không làm gì cả. Chuyển hướng đầu ra của nó thông qua >>làm cho đầu ra trống được thêm vào một tệp. Việc chuyển hướng sẽ khiến tập tin được tạo nếu tập tin không tồn tại.
casey

6
Điều đó không hoạt động: mở một tệp hiện có cho đầu ra, nhưng không ghi vào nó, không thay đổi thời gian (dù sao trên hệ thống của tôi). Ngay cả khi nó đã làm, bạn không cần và không nên sử dụng echo -ncho một lệnh không có gì. echo -ncó thể xuất chuỗi "-n" dưới một số shell. Nếu bạn thực sự cần một lệnh không có gì, :hoặc truelà một lựa chọn tốt hơn, nhưng >> myfilebản thân nó cũng là một cách hoàn toàn hợp lệ để tạo tệp nếu nó không tồn tại. Tất cả điều này, tất nhiên, hỗ trợ câu trả lời của bạn rằng bạn chỉ nên sử dụng "chạm".
hvd

40

Cuộc gọi hệ thống cơ bản ( utime) rất quan trọng đối với các tiện ích khác nhau như tarcó thể đặt dấu thời gian của tệp mới được sao chép (chưa được mã hóa). Một số tiện ích sao lưu cũng có thể được tùy chọn để thiết lập lại thời gian cuối cùng của các tệp mà chúng đã sao chép.

Một cách sử dụng hợp pháp touchlà tạo một tệp có dấu thời gian cụ thể. Một tệp "tham chiếu" như vậy sau đó có thể được sử dụng bởi các lệnh như find. Ví dụ: để tìm tất cả các tệp được sửa đổi gần đây hơn ngày 1 tháng 11 năm 2013 (tức là 2013/11/01) "

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

Làm thế nào để tính toán 201311010000 có nghĩa là tháng 11 năm 2013? Có một tiện ích sẽ cho tôi biết điều này? Nói cách khác, làm thế nào để tôi xác định đầu vào để chạm?
Geek

4
@Geek Bằng cách xem số và lưu ý rằng phần đầu tiên 20131101, có thể được chia thành 2013-11-01, hoặc ngày 1 tháng 11 năm 2013. Sau đó, bạn có thể giả sử rằng 0000phần đó cho biết thời gian cụ thể trong ngày, trong trường hợp này là 00 giờ, 00 phút. Hoặc bạn chỉ có thể nhìn vào trang hướng dẫn touch, cho bạn biết chính xác định dạng là gì (xem -t).
JAB

@Geek Các trang web là bạn của bạn :-)
JRFerguson

39

Các touchmục đích chính của lệnh được thao tác timestamps của tác phẩm, và để tạo tập tin.

Ví dụ

1. tạo tập tin

$ 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

LƯU Ý: Đầu total 0ra từ ls -llà chính xác. Việc triển khai này lscho thấy số lượng khối đang được sử dụng bởi các tệp khi chúng được liệt kê. Bạn có thể đảm bảo cho mình về thực tế này bằng cách thêm công -stắc vào ls. Điều này sẽ liệt kê các khối được sử dụng bởi mỗi tập tin. Ở đây tôi đã thêm 2 ký tự vào file1 & file2.

Thí dụ

$ 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. thông tin thời gian / ngày của một tập tin - lệnh 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: -

Chúng ta có thể sử dụng touchđể thao tác các dấu thời gian khác nhau trên một tệp nhất định.

3. trích đoạn từ trang man

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

4. thao túng thời gian truy cập

$ 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. Thao tác sửa đổi thời gian

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

Bạn có thể tự hỏi về thời gian thay đổi (ctime). Điều đó không thể được thao tác bằng cách sử dụng touch. Theo dõi thời gian bất kỳ dữ liệu meta nào được chạm vào tệp. Xem Hỏi & Đáp về U & L này để biết thêm chi tiết, có tiêu đề: Bạn có thể làm gì với một tệp mà không kích hoạt Dấu thời gian "Thay đổi"? .


@sim: câu hỏi của tôi ngụ ý rằng tôi biết rằng cảm ứng là để thay đổi dấu thời gian. Tôi chỉ muốn biết tại sao một người dùng trung thực sẽ muốn điều đó. Nếu không phải là phần thời gian trong câu trả lời của bạn, tôi đã cho bạn -1.
Quora Feans

16
@QuoraFea - câu trả lời của tôi là vì lợi ích của bạn và người dùng đã từng gặp nó trong tương lai. Xin đừng cho rằng một câu trả lời hoàn toàn là vì lợi ích của bạn và tôi xin lỗi nếu tôi đã xúc phạm bạn bằng mọi cách, đó không phải là ý định của tôi, tôi chỉ cố gắng giải thích nền tảng của cách thời gian hoạt động.
slm

@sim: Tôi không bị xúc phạm, chỉ nghĩ rằng câu trả lời không đi đúng hướng. Dù sao, cảm ơn câu trả lời này.
Quora Feans

@QuoraFea - bạn khá hoan nghênh và cảm ơn vì Q. của bạn. Chúng được đánh giá cao!
slm

1
@Geek - thử các lệnh. Đó là đầu ra chính xác từ ls -ltrong một thư mục nơi các tệp có kích thước 0 và chưa có gì khác tồn tại. Ngay sau khi bạn đưa ra một trong các kích thước tệp thì tổng số sẽ hiển thị w / số lượng khối được sử dụng bởi các tệp. Xem cập nhật của tôi nếu bạn không chắc chắn, tôi đã thêm một ví dụ.
slm

20

Ngoài hai câu trả lời rất hay khác mà bạn có, còn một cách sử dụng khác là, theo lời của bạn, là

tạo ấn tượng sai về tuổi của tệp

ví dụ để sử dụng trong các chương trình sao lưu . Bạn có thể không muốn cập nhật bản sao lưu với bản mới hơn vì chúng giống hệt nhau hoặc do các thay đổi không liên quan so với chi phí cập nhật bản sao lưu trên, giả sử, một dòng chậm vào máy chủ từ xa. Để đạt được điều này, bạn có tùy chọn đơn giản là đánh dấu tệp sao lưu bằng dấu thời gian mới hơn, không giả mạo nhưng tuyên bố rằng dấu thời gian hợp lệ của tệp đó bây giờ là một tệp khác.

Ấn tượng về tuổi của tập tin bây giờ thực sự là sai, nhưng ý nghĩa của nó có thật và hợp pháp.


20

Một trong những cách sử dụng phổ biến nhất touchlà - hoặc ít nhất là được sử dụng - để kích hoạt việc xây dựng lại mã.

Các công cụ xây dựng thông thường - makevà các công cụ phái sinh của nó - cố gắng lưu công việc bằng cách không biên dịch lại / xây dựng lại các tệp trừ khi một trong các tệp tạo ra chúng đã thay đổi - ví dụ: nếu tệp .o gần đây hơn tệp .c nguồn, thường an toàn khi cho rằng nguồn C đã không bị thay đổi kể từ khi được biên dịch để tạo tệp đối tượng đó.

Nhưng có những lúc bạn muốn buộc một cái gì đó được xây dựng lại. Bạn có thể thực hiện một sửa đổi không cần thiết đối với một trong các tệp nguồn của nó, nhưng điều đó có nguy cơ vô tình làm hỏng một cái gì đó. Thay vào đó, bạn có thể chỉ đơn giản touchlà tệp, làm cho nó trông mới mà không có bất kỳ rủi ro nào làm thay đổi nội dung của nó - và điều đó đủ để thuyết phục makerằng đã đến lúc phải xây dựng lại mọi thứ phụ thuộc vào tệp đó.

Có những cách sử dụng khác, nhưng trong lịch sử đó là một công dụng lớn.


Trong khi nó thay đổi một ý tưởng tốt để thay đổi một tập tin để gây dựng lại, tôi sẽ tranh luận chống lại nó. Một số hệ thống sửa đổi mã nguồn có thể bị nhầm lẫn về một tệp đã thay đổi. Vì vậy, touchlà xấu như một thay đổi thủ công. Để gây dựng lại, tôi khuyên bạn nên xóa các tệp đầu ra .ocủa nguồn đang đề cập.
harper

1
Các thay đổi thủ công và xóa các tệp .o đều yêu cầu nhiều thời gian và gõ hơn, và thay đổi thủ công sẽ dễ bị lỗi hơn nhiều. Và chúng tôi chỉ nói về việc sửa đổi dấu thời gian trên một bản sao đang hoạt động - nếu chỉnh sửa được thực hiện sau đó, tệp sẽ phản ánh chính xác dấu thời gian thay đổi. Và không phải tất cả các hệ thống kiểm soát phiên bản đều bị nhầm lẫn bởi dấu thời gian.
David

1
Như David đã nói. Đây thực sự là tiêu chuẩn thực hành Unix cách đây không lâu và vẫn là thực tiễn tiêu chuẩn cho các nhà phát triển làm việc bên ngoài các IDE.
keshlam

12

Tôi đã làm việc với ít nhất một khung web (không thể nhớ được) trong chế độ phát triển đã xem các tệp mã nguồn để thay đổi và tải lại ứng dụng khi điều đó xảy ra.

Tất nhiên đôi khi bạn muốn nó tải lại sau khi thay đổi thứ gì đó mà nó không xem, trong trường hợp đó, touchtập tin cấu hình chính của nó đã thực hiện thủ thuật.

Vì vậy, trong trường hợp chung, bất cứ khi nào bạn muốn bắt đầu một quá trình được kích hoạt bằng cách thay đổi tệp, mà không thực sự thay đổi tệp.


4
Đây thực sự là trường hợp với mod_wsgi và apache; bạn có thể tải lại, ví dụ: ứng dụng web django chỉ bằng cách chạm vào tệp wsgi.
sapi

11

Sử dụng hợp pháp của cảm ứng:

  • Cập nhật dấu thời gian của các tệp hình ảnh (GIF / JPG / vv) vào thời gian chúng được chụp. Không phải tất cả các trình kết xuất đều đọc hoặc chú ý đến thông tin EXIF.
  • Giữ c / m-time khi cập nhật hàng loạt một tập tin trong đó dấu thời gian là quan trọng đối với gói tệp.
  • Đặt thời gian của tệp bó (tức là CSV) nếu bạn cần thực hiện nhập khác sau khi thất bại và chương trình nhập phụ thuộc vào dấu thời gian (để cuộc thảo luận đó sang chủ đề khác :-))
  • Mục đích lưu trữ, tức là có các bản sao lưu trong các thư mục dựa trên năm, sau đó đặt thời gian trên các thư mục này thành ngày 1 tháng 1 YYYY để dễ dàng sắp xếp

7

Một cách sử dụng là sửa dấu thời gian của tệp được đặt không đúng.

Ví dụ: hầu hết mọi cách bạn sao chép tệp (và đối với một số cách bạn có thể di chuyển tệp) đều dẫn đến tệp mới có dấu thời gian của thời gian hiện tại, thay vì dấu thời gian của tệp gốc.

Thông thường, đây không phải là những gì mong muốn. Chạm có thể "sửa" điều đó.

Một cách sử dụng khác là để phản ánh một sửa đổi tệp đã được hoàn tác bằng cách khôi phục dấu thời gian của tệp về trước khi hoạt động "chỉnh sửa ... hoàn tác chỉnh sửa".


2
Thật. Thời gian trôi qua tôi thấy alias cp='cp --preserve=timestamps'phù hợp hơn với tôi trong PC đất
Runium

5

Một sự khác biệt quan trọng so với thingsthích echo(hoặc thậm chí tốt hơn > filenhư được đề cập bởi những người khác) là cảm ứng sẽ không đập vỡ nội dung. > filesẽ làm trống một tập tin. touchsẽ không. Thay vì nghĩ ra các thủ thuật để tránh thiệt hại nội dung, chỉ cần sử dụng cảm ứng! Dù sao thì nó cũng sẽ làm việc ít hơn trong kernel, bởi vì nó sẽ chỉ hoạt động với các thuộc tính của tệp mà không lãng phí thời gian thực sự chuẩn bị cho việc mở và sau đó thực hiện đóng.

Touch có thể có thể thay đổi dấu thời gian ngay cả khi tệp hiện đang bị khóa bắt buộc hoặc khóa tư vấn hoặc mở độc quyền. Hmmm, chưa bao giờ kiểm tra hoặc đọc về nó ...


2
>>sẽ nối thêm thay vì ghi đè
Michael Mrozek

Tôi đã xem xét đề cập đến điều đó, nhưng nó thậm chí còn đi sâu hơn vào lãnh thổ tác dụng phụ. Bạn cũng phải đề cập đến thực tế là nó sẽ gây ra lỗi nếu tập tin đã được mở độc quyền, v.v ... Một vấn đề có thể áp dụng thông qua việc sử dụng> quá. Tôi đoán rằng điểm thứ yếu của tôi - vượt ra ngoài điểm chính là nhanh hơn một chút khi chỉ chạm vào số liệu thống kê của tệp - đó là một ý tưởng tốt để viết mã nói thẳng, thay vì đập xung quanh bụi rậm.

4

Đây là một - Tôi sử dụng một chương trình phần mềm có tên SageTV để ghi lại các chương trình truyền hình - những chương trình này thường được ghi ở MPEG-2 không phải là một codec rất hiệu quả, nó cũng không thân thiện với iPad / iPhone. Vì vậy, tôi chuyển đổi các tập tin thành tập tin .mp4. Nhưng khi phát lại các tệp, SageTV hy vọng dấu thời gian của tệp sẽ xuất hiện khi chương trình TV bắt đầu - nếu không, nó sẽ làm hỏng dòng thời gian của chương trình để không dễ dàng FF hoặc REW. Do đó, tôi sử dụng cảm ứng để đặt lại dấu thời gian của tệp .mp4 giống với tệp gốc.
Điều đó có hợp pháp không?


2

Thường thì bạn có thể có một quá trình thay đổi từ userid, như từ root -> cái gì đó khác. Touch có thể cung cấp cho bạn cơ hội để tạo một tệp ở một nơi mà chỉ root mới có thể chạm vào trước khi ứng dụng bắt đầu đăng nhập vào nó như người dùng khác.


Đó không phải là việc sử dụng cảm ứng mà không thể thực hiện được bằng "tiếng vang" - xem câu hỏi ban đầu của tác giả
Domingo Ignacio Galdos

Echo liên quan đến việc mở một luồng và như vậy. Touch có thể được tối ưu hóa bằng cách làm việc trực tiếp với các nút. FTW THỰC HIỆN!
dùng56560

2

Tại nơi làm việc, chúng tôi có một kho lưu trữ các bản đồ kỹ thuật số từ hơn 15 năm trước. Các bản đồ cũ này được lưu ở nhiều định dạng như PostScript, EMF, PRN, hpgl2, pdf, v.v. mà hầu hết các chương trình không hiểu. Hoặc bạn cần một tá chương trình khác nhau để xem tất cả.

Để tạo điều kiện dễ dàng tìm kiếm và duyệt tất cả các định dạng khác nhau này, chúng tôi tạo các phiên bản jpeg của bản đồ và sau đó sử dụng cảm ứng để làm cho tệp jpeg khớp với dấu thời gian của tệp nguồn gốc - thường là nhiều năm sau khi bản gốc được tạo.

Bây giờ chúng tôi có thể sử dụng một chương trình duy nhất như Picasa để xem toàn bộ thư viện và định vị một cách tầm thường các phạm vi ngày nhất định. Nếu không có cảm ứng, chúng ta phải thêm siêu dữ liệu ngày cho mỗi hình ảnh, có thể là thủ công và sau đó tìm kiếm trên các chuỗi đó khi tìm kiếm một phạm vi ngày cụ thể.


1

Tôi chưa sử dụng nó cho mục đích này, nhưng tôi có một tập lệnh đọc các tập tin và ngày tháng của chúng từ một thư mục và đọc chúng để sử dụng trên một trang web. Nếu tôi phải chỉnh sửa một cái, nó sẽ thay đổi ngày. Tôi đã xem xét touching họ để thiết lập lại trật tự của họ.


1

Một số init-script so sánh dấu thời gian của tệp cấu hình với tệp pid của riêng chúng. Kết quả quyết định có tải lại dịch vụ đang chạy hay không.

Nếu có một tình huống mà bạn không muốn thay đổi cấu hình nhưng muốn buộc tải lại, chạm sẽ giúp bạn ở đây.


0

Tôi có một công việc định kỳ nhận các thay đổi từ cơ sở dữ liệu đã xảy ra giữa lần chạy cuối cùng của công việc và lần chạy hiện tại. Nó tạo ra một tệp XML về các thay đổi sau đó được xử lý vào một cơ sở dữ liệu khác nhau. Nó nhận được thời gian chạy cuối cùng từ dấu thời gian trên tệp đầu ra XML. *

Nếu bất cứ điều gì xảy ra trong quá trình xử lý tệp XML, tôi có thể muốn lặp lại việc chạy từ ngày ban đầu không phải từ ngày được đề cập trên dấu thời gian của tệp XML mới.

Cách đơn giản nhất để thực hiện việc này, thay vì chỉnh sửa các tập lệnh được gọi, v.v. là chạm vào tệp XML và buộc dấu thời gian là ngày tôi yêu cầu.

Ngoài ra nếu tôi bắt đầu một lần nữa (không có tệp đầu ra XML trước đó) tôi có thể chỉ cần mô phỏng sự tồn tại của nó bằng cách sử dụng cảm ứng.

[*] Trước khi ai đó chỉ ra - Tôi nhận ra thời gian công việc bắt đầu và việc viết tệp XML để lại một khoảng cách thời gian trong vài phút khi các thay đổi DB có thể xảy ra. Công việc chạy vào thời điểm DB thay đổi là cực kỳ khó xảy ra. Đó là lý do của tôi và tôi đang gắn bó với nó :-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.