Sự khác biệt giữa tập tin cảm ứng và tập tin> là gì?


17

Tôi là người mới làm quen với Linux và tôi tự hỏi liệu có hay không >touchcó tác dụng tương tự. Ý tôi là, hai lệnh sau có cùng tác dụng không?:

$ > file.txt

$ touch file.txt

Nếu vậy, thật tuyệt khi biết rằng tôi chỉ có thể gõ `> file.txt 'để tạo các tệp mới.


5
Nếu file.txtđã tồn tại và không trống, chắc chắn họ không.
fkraiem

1
@fkraiem, bạn có thể vui lòng trả lời chi tiết không?
lmiguelvargasf

4
Anh ta nói nếu bạn touchmột tập tin chứa dữ liệu sẽ không có gì xảy ra nhưng nếu bạn >tập tin đó sẽ bị xóa.
WinEunuuchs2Unix

Tôi hiểu rồi. Cảm ơn bạn rất nhiều vì sự làm rõ đó @ WinEunuuchs2Unix
lmiguelvargasf

Bạn có muốn trả lời câu hỏi không, để tôi trả lời câu hỏi, có @fkraiem trả lời hay xóa nó không?
WinEunuuchs2Unix

Câu trả lời:


24

Cả hai touch>sẽ tạo một tệp mới nếu nó không tồn tại. Như các lệnh đầu cuối sau hiển thị khi bạn touchcó tệp hiện có, thời gian truy cập / sửa đổi lần cuối được cập nhật. Nhưng nếu bạn >vào một tệp hiện có thì nó bị cắt ngắn và thời gian sửa đổi cuối cùng được cập nhật (thời gian truy cập không). Lưu ý rằng >không xóa / hủy liên kết tệp. Inode vẫn giữ nguyên - đó là lý do tại sao >/ hoặc truncatethường được sử dụng để xóa các tệp nhật ký ngay cả với một tay cầm tệp mở.

rick@dell:~$ > EmptyFile

rick@dell:~$ touch EmptyFile2

rick@dell:~$ ls Empty*
EmptyFile  EmptyFile2

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ echo Hello > EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 6 Sep 29 20:28 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ > EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 0 Sep 29 20:28 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ echo Hello > EmptyFile

rick@dell:~$ touch EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 6 Sep 29 20:32 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

Như đã đề cập trong các bình luận, touchlà một lệnh bên ngoài và chỉ hoạt động trên các tệp. >là một tính năng tích hợp sẵn phục vụ nhiều mục đích khác nhau. Thông thường bạn sẽ thấy nó được sử dụng như thế nào cat source.fil > target.fil.

Một hình thức dài để làm trống một tập tin sẽ là:

cat /dev/null > emptyme.fil

Sử dụng > emptme.filhoàn thành điều tương tự trong một định dạng nhỏ gọn để chuyển hướng không có gì vào tệp.


Ca sử dụng: > file.txttốt cho việc xóa các tệp nhật ký.
Rinzwind

8
Nó không thực sự được tạo lại. Tệp hiện có bị cắt ngắn, khác với việc hủy liên kết tệp cũ và tạo tệp mới. Sự khác biệt lớn nhất có thể quan sát được là nếu một tiến trình vẫn có tệp cũ được mở hoặc ánh xạ, thì nó vẫn tồn tại. Nhưng cắt ngắn sẽ ảnh hưởng đến tập tin mà các quá trình khác đã mở.
Peter Cordes

1
Không chắc chắn về "quan sát lớn nhất" - thật dễ dàng để quan sát xem các liên kết cứng có bị hỏng hay không (nếu bạn ln foo bar, sau đó xóa và tạo lại foo, barvẫn có nội dung trước đó).
Charles Duffy

1
Ồ vâng, đó là một sự khác biệt thậm chí dễ quan sát hơn. Tôi nên nghĩ về điều đó: P
Peter Cordes

@ Charles-Duffy Chắc chắn, khi có 2 liên kết đến một fie rõ ràng tôi đoán, điều đó không liên quan gì đến những gì Peter Cordes đã nói. Khi bạn xóa / hủy liên kết một tệp hiện đang sử dụng / đã mở tệp đó, nó sẽ không bị xóa. ví dụ: giả sử bạn rm /var/log/nginx/access.logtrong khi nginx mở tệp đó thì nó sẽ có 0 liên kết nhưng inode vẫn tồn tại. lsof -c nginx | grep access.logsau đó với pid ls -l /proc/<pid>/fd/ | grep access.logvà cuối cùng là cat / Proc / <pid> / fd / <tên tệp từ lệnh trước> `. Bình luận mặc dù điều này là cũ. Hy vọng nó có ý nghĩa
skrewler

14

Có một sự khác biệt đáng kể giữa hai. Touchlà một lệnh được sử dụng để đóng dấu thời gian một tập tin. Các >biểu tượng là một redirector đầu ra tiêu chuẩn.

Cách sử dụng của hai giải thích

Cách sử dụng cảm ứng

Nếu tệp không tồn tại, nó sẽ tạo tệp.

Touch thường được sử dụng để tạo cờ. Chẳng hạn, nếu bạn muốn tìm tất cả các tệp trong khoảng hai lần trên hệ thống của mình, bạn có thể sử dụng chuỗi lệnh này:

$ touch -t 201609292200 starttime 
$ touch -t 201609292300 endtime

Điều này sẽ tạo các tệp sau (hoặc thay đổi dấu thời gian nếu chúng tồn tại):

-rw-rw-r-- 1 ljames ljames 0 Sep 29 23:00 endtime
-rw-rw-r-- 1 ljames ljames 0 Sep 29 22:00 starttime

Bây giờ bạn có thể sử dụng find để hiển thị hoặc xử lý tất cả các tệp đã được sửa đổi vào giờ đó (thời gian giữa hai dấu thời gian của hai tệp đó, tức là từ 10 giờ tối đến 11 giờ tối ngày 29 tháng 9 năm 2016).

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n"

Đây là một phần đầu ra của lệnh find ở trên:

-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/apollothethird@gmail.com_groups.xml
-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/apollothethird@gmail.com.xml
-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/address_book_backups/abook.mab.bak
-rw-rw-r-- 09/29 23:00 00 /home/users/l/j/ljames/endtime
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/Temp
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/fahmaaghhglfmonjliepjlchgpgfmobi
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/fahmaaghhglfmonjliepjlchgpgfmobi/1.337.0_0

Sử dụng chuyển hướng đầu ra

Biểu tượng chuyển hướng sẽ chuyển hướng đầu ra tiêu chuẩn đến tệp được chỉ định. Tùy thuộc vào cài đặt clobber / noclobber của bạn nếu có thể thất bại. Noclobber sẽ chỉ tạo tệp nếu nó không tồn tại.

Có một số phiên bản của đầu ra chuyển hướng bao gồm:

> - Chuyển hướng đầu ra tiêu chuẩn. Tạo hoặc ghi đè lên tập tin hiện có.
>> - Chuyển hướng bổ sung. Tạo hoặc chắp thêm vào tập tin hiện có.
> & - Chuyển hướng cả đầu ra tiêu chuẩn và lỗi tiêu chuẩn.
>> & - Chuyển hướng / Nối cả đầu ra tiêu chuẩn và lỗi tiêu chuẩn

Chúng tôi có thể sử dụng findlệnh của chúng tôi ở trên để chuyển hướng nội dung của tất cả các tệp được tạo trong giờ đã chỉ định đến một tệp mà chúng tôi có thể đăng nhập và nghiên cứu sau:

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n" > ~/files.log

Nhiều người đã đề cập rằng, nếu file.txttồn tại và không trống, thì > file.txtsẽ xóa nội dung của nó nhưng touch file.txtsẽ không. Nhưng không ai đề cập rằng đó >> file.txtlà một sự thay thế tốt cho touch file.txt- nó sẽ tạo tệp nếu nó không tồn tại (giả sử rằng bạn có quyền làm như vậy), nhưng nó sẽ không cắt bớt một tệp hiện có. Xem sự khác biệt giữa những người khác nhau
G-Man nói 'Phục hồi Monica'

Điều này được giải thích trong phần Usage of Output redirection. Thông báo là nói >>= Redirect append>.
LD James

Vâng, và điều đó hoàn toàn rõ ràng - với những người đã biết điều đó. Đặt mình vào vị trí của OP - bạn đã đăng một bức tường văn bản quá dài Đọc quá ; anh ấy sẽ không hiểu từ câu trả lời của bạn mà >> file.txtlà một sự thay thế hoàn toàn khả thi touch file.txt. (Thực tế rằng bạn là người duy nhất đề cập >> ở tất cả là lý do tại sao tôi đã đăng nhận xét của tôi dưới câu trả lời của bạn, chứ không phải dưới câu hỏi.)
G-Man Says 'Khôi phục Monica'

1
@ G-Man Một số người nhầm lẫn biểu tượng chuyển hướng là một thay thế cho cảm ứng. Tuy nhiên nó không phải là một thay thế. Các chi tiết của câu trả lời của tôi là để làm rõ sai lầm này. Các ví dụ về việc sử dụng hai là để giúp làm rõ nó. Xin lưu ý dòng đầu tiên trả lời các chi tiết cụ thể ban đầu của nhận xét hiện tại của bạn. Nó nói rằng có một sự khác biệt đáng kể giữa hai. OP quan tâm đến sự khác biệt. Vì vậy, các phần khác của câu trả lời là để đáp ứng sự quan tâm của OP đối với cả hai. Có những hiệu ứng khác nhau và có một lý do cho sự khác biệt.
LD James

9

>là toán tử chuyển hướng đầu ra shell, được sử dụng để chuyển hướng STDOUT của (các) lệnh trước đến bộ mô tả tệp được đề cập sau >. Nếu tập tin là hiện nay, đó là nội dung sẽ được rút ngắn, như tập tin với được open(2)-ed với O_TRUNCcờ, và nếu các tập tin không tồn tại, nó sẽ được tạo ra.

Điều quan trọng cần lưu ý rằng, toán tử chuyển hướng này sẽ được xử lý bằng shell trước khi lệnh trước chạy, do đó, điều này không phụ thuộc vào bất kỳ lệnh nào và được xử lý bởi chính shell.

Lưu ý rằng, một số shell (ví dụ zsh) sẽ hoạt động khác với chuyển hướng trống như:

 >file.txt

Một cách giải quyết khác là thêm lệnh :( true) no-op:

 : >file.txt

Theo truyền thống, mục đích chính touchlà thay đổi dấu thời gian của tệp, không tạo tệp.

touchtạo một tệp, chỉ khi (các) tệp được đề cập trong đối số không tồn tại, nếu không, nó sẽ thay đổi thời gian sửa đổi của tệp thành dấu thời gian hiện tại. Bạn cũng có thể thay đổi thời gian truy cập và thời gian tạo inode bằng cách sử dụng touch.


zshkhông hỗ trợ chuyển hướng trống - nó hoạt động khá giống với chuyển hướng catkhông có đối số vào tệp. Về cơ bản, bất cứ điều gì bạn gõ sẽ được ghi vào tệp cho đến khi một ký tự EOF hoặc ngắt. zshHành vi của gương này chỉ với <file, chỉ đơn giản là in nội dung tệp, như catsẽ làm. Đây có thể là cấu hình, tôi đã thấy <filemở tệp trong một máy nhắn tin.
8bittree

@ 8bittree Điều tôi muốn nói là bạn cần nhập liệu EOF(như làm cat >file.txtnhư bạn đã nói), trong đó bashchỉ cần làm là >file.txtđủ.
heemayl

Đủ công bằng, tôi đề nghị một chỉnh sửa mà tôi nghĩ rằng có ý tưởng rõ ràng hơn.
8bittree

@ 8bittree Đã phê duyệt.
heemayl

(1) Theo mặc định, touchcập nhật cả thời gian sửa đổi và thời gian truy cập của tệp. Có các tùy chọn để cập nhật chỉ một hoặc khác. (2) Nói chung, Unix / Linux / POSIX không hỗ trợ thời gian tạo inode. Một số loại hệ thống tệp hỗ trợ nó, nhưng không có cách nào để xem xét nó, chứ đừng nói đến việc sửa đổi nó. Bạn có thể cung cấp một tài liệu tham khảo nói rằng có một hóa thân touchcho phép người dùng thay đổi thời gian tạo inode không?
Scott
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.