ความแตกต่างระหว่างไฟล์ทัชและไฟล์> คืออะไร?


17

ผมชนิดของ newbie เพื่อ Linux และฉันสงสัยว่าจริงหรือไม่>และtouchมีผลเช่นเดียวกัน ฉันหมายความว่าสองคำสั่งต่อไปนี้มีผลเหมือนกันหรือไม่:

$ > file.txt

$ touch file.txt

ถ้าเป็นเช่นนั้นจะเป็นการดีที่ได้รู้ว่าฉันสามารถพิมพ์ `> file.txt 'เพื่อสร้างไฟล์ใหม่


5
หากfile.txtมีอยู่แล้วและไม่ว่างเปล่าพวกเขาจะไม่แน่นอน
fkraiem

1
@ fkraiem คุณช่วยตอบคำถามแบบละเอียดได้ไหม?
lmiguelvargasf

4
เขาบอกว่าถ้าคุณtouchไฟล์ที่มีข้อมูลจะไม่มีอะไรเกิดขึ้น แต่ถ้าคุณ>ไฟล์มันจะถูกลบ
WinEunuuchs2Unix

ฉันเข้าใจแล้ว. ขอบคุณมากสำหรับคำอธิบายนั้น @ WinEunuuchs2Unix
lmiguelvargasf

คุณต้องการที่จะตอบคำถามให้ฉันตอบคำถามมี @fkraiem ตอบหรือลบมัน?
WinEunuuchs2Unix

คำตอบ:


24

ทั้งสองtouchและ>จะสร้างไฟล์ใหม่หากไม่มีอยู่ ตามคำสั่งเทอร์มินัลต่อไปนี้จะแสดงเมื่อคุณtouchไฟล์ที่มีอยู่เวลาที่เข้าถึง / แก้ไขครั้งล่าสุดจะถูกอัพเดต แต่ถ้าคุณ>ไปยังไฟล์ที่มีอยู่มันจะถูกตัดทอนและเวลาที่แก้ไขล่าสุดจะถูกอัพเดต (เวลาในการเข้าถึงไม่ใช่) โปรดทราบว่า>จะไม่ลบ / ยกเลิกการเชื่อมโยงไฟล์ inode ยังคงเหมือนเดิม - ซึ่งเป็นสาเหตุ>/ หรือtruncateถูกนำมาใช้เพื่อล้างไฟล์บันทึกแม้ว่าจะมีการเปิดไฟล์ก็ตาม

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

ดังที่ได้กล่าวไว้ในความคิดเห็นtouchเป็นคำสั่งภายนอกและทำงานเฉพาะไฟล์เท่านั้น >เป็นคุณสมบัติในตัวของเชลล์ที่ให้บริการตามวัตถุประสงค์ที่แตกต่างกัน cat source.fil > target.filโดยปกติแล้วคุณจะเห็นว่ามันมาใช้เช่น

รูปแบบยาวเพื่อล้างไฟล์จะเป็น:

cat /dev/null > emptyme.fil

การใช้งาน> emptme.filสำเร็จในสิ่งเดียวกันในรูปแบบที่กะทัดรัดของการเปลี่ยนเส้นทางอะไรไปยังไฟล์


กรณีใช้: > file.txtดีสำหรับการล้างไฟล์บันทึก
Rinzwind

8
มันไม่ได้ถูกสร้างขึ้นใหม่จริง ๆ ไฟล์ที่มีอยู่ถูกตัดทอนซึ่งแตกต่างจากการยกเลิกการเชื่อมโยงไฟล์เก่าและสร้างไฟล์ใหม่ ความแตกต่างที่สังเกตได้ที่ใหญ่ที่สุดคือถ้ากระบวนการยังคงเปิดไฟล์เก่าหรือแมปก็จะยังคงอยู่ แต่การตัดทอนจะส่งผลต่อไฟล์ที่กระบวนการอื่นเปิดอยู่
Peter Cordes

1
ไม่แน่ใจว่าเกี่ยวกับ "ยิ่งใหญ่ที่สุดที่สังเกตได้" - มันเป็นเรื่องง่ายที่จะสังเกตเห็นว่า hardlinks จะแตก (ถ้าคุณln foo barแล้วลบและสร้างfoo, barยังคงมีเนื้อหาของมันก่อน)
Charles Duffy

1
โอ้ใช่นั่นเป็นความแตกต่างที่สังเกตได้ง่ายขึ้น ฉันควรนึกถึง: P
Peter Cordes

@ Charles-Duffy แน่นอนว่าเมื่อมีลิงก์เชื่อมโยงไปยังสถานที่ที่น่ากลัวอย่างเห็นได้ชัดฉันคิดว่าคงไม่มีอะไรเกี่ยวข้องกับสิ่งที่ Peter Cordes พูด เมื่อคุณลบ / ยกเลิกการเชื่อมโยงไฟล์ที่ใช้งานอยู่ในปัจจุบัน / มีการเปิด filehandle มันจะไม่ถูกลบ ตัวอย่างเช่นสมมติว่าคุณrm /var/log/nginx/access.logในขณะที่ nginx เปิดไฟล์นั้นจะมี 0 ลิงก์ แต่ inode จะยังคงอยู่ lsof -c nginx | grep access.logจากนั้นด้วย pid ls -l /proc/<pid>/fd/ | grep access.logและในที่สุด cat / proc / <pid> / fd / <filename จากคำสั่งก่อนหน้า> ` แสดงความคิดเห็นแม้ว่านี่จะเก่าแล้วก็ตาม หวังว่ามันจะสมเหตุสมผล
skrewler

14

มีความแตกต่างอย่างมากระหว่างสองสิ่งนี้ Touchเป็นคำสั่งที่ใช้ในการประทับเวลาไฟล์ >สัญลักษณ์เป็นตัวเปลี่ยนเส้นทางออกมาตรฐาน

การใช้งานของทั้งสองอธิบาย

การใช้งานของ Touch

หากไฟล์ไม่มีอยู่มันจะสร้างไฟล์

Touchใช้กันทั่วไปในการสร้างธง ตัวอย่างเช่นหากคุณต้องการค้นหาไฟล์ทั้งหมดระหว่างสองครั้งในระบบของคุณคุณสามารถใช้ลำดับของคำสั่งนี้:

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

สิ่งนี้จะสร้างไฟล์ต่อไปนี้ (หรือเปลี่ยนการประทับเวลาหากมี):

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

ตอนนี้คุณสามารถใช้ค้นหาเพื่อแสดงหรือประมวลผลไฟล์ทั้งหมดที่ถูกแก้ไขในชั่วโมงนั้น (เวลาระหว่างการประทับเวลาของทั้งสองไฟล์นั่นคือระหว่าง 22.00 น. และ 23.00 น. ของวันที่ 29 กันยายน 2016)

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

นี่เป็นเอาต์พุตบางส่วนของคำสั่ง find ด้านบน:

-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

การใช้งานการเปลี่ยนเส้นทางเอาต์พุต

สัญลักษณ์การเปลี่ยนเส้นทางจะเปลี่ยนเส้นทางเอาต์พุตมาตรฐานไปยังไฟล์ที่ระบุ ขึ้นอยู่กับการตั้งค่า clobber / noclobber ของคุณหากอาจล้มเหลว Noclobber จะสร้างไฟล์หากไม่มีอยู่เท่านั้น

มีจำนวนเวอร์ชันของเอาต์พุตการเปลี่ยนทิศทางซึ่งรวมถึง:

> - เปลี่ยนเส้นทางออกมาตรฐาน สร้างหรือเขียนทับไฟล์ที่มีอยู่
>> - เปลี่ยนเส้นทางผนวก สร้างหรือผนวกเข้ากับไฟล์ที่มีอยู่
> & - เปลี่ยนเส้นทางทั้งเอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐาน
>> & - การเปลี่ยนเส้นทาง / ผนวกทั้งเอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐาน

เราสามารถใช้findคำสั่งของเราด้านบนเพื่อเปลี่ยนเส้นทางเนื้อหาของไฟล์ทั้งหมดที่สร้างขึ้นภายในเวลาที่กำหนดไปยังไฟล์ที่เราสามารถบันทึกและศึกษาในภายหลัง:

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

หลายคนพูดว่าถ้าfile.txtมีอยู่และไม่ว่างเปล่าก็> file.txtจะล้างเนื้อหา แต่touch file.txtจะไม่ แต่ไม่มีใครพูดถึงว่า>> file.txtมันเป็นสิ่งที่ดีแทนtouch file.txt- มันจะสร้างไฟล์ถ้ามันไม่มีอยู่ (สมมติว่าคุณได้รับอนุญาตให้ทำ) แต่มันจะไม่ตัดทอนไฟล์ที่มีอยู่ ดูความแตกต่างระหว่าง“>” และ“ >>” คืออะไร?
G-Man กล่าวว่า 'Reinstate Monica'

Usage of Output redirectionนี่คือคำอธิบายในส่วน แจ้งให้ทราบจะพูดว่า=>> Redirect append>
LD James

ใช่และนั่นชัดเจนอย่างสมบูรณ์ - สำหรับผู้ที่รู้อยู่แล้ว ร่วมแข่งขันด้วย OP - คุณโพสต์ข้อความที่ยาวเกินไปอ่านแล้ว เขาจะไม่เข้าใจจากคำตอบของคุณที่>> file.txtสามารถใช้แทนtouch file.txtได้ (ความจริงที่ว่าคุณเป็นคนเดียวที่พูดถึง>> ทั้งหมดคือเหตุผลที่ฉันโพสต์ความคิดเห็นของฉันภายใต้คำตอบของคุณมากกว่าภายใต้คำถาม)
G-Man พูดว่า 'Reinstate Monica'

1
@ G-Man บางคนสร้างความสับสนให้สัญลักษณ์เปลี่ยนเส้นทางเพื่อใช้แทนการสัมผัส อย่างไรก็ตามมันไม่ใช่สิ่งทดแทน รายละเอียดของคำตอบของฉันคือการชี้แจงข้อผิดพลาดนี้ ตัวอย่างของการใช้ทั้งสองคือช่วยชี้แจงให้ชัดเจน โปรดสังเกตว่าคู่แรกจะตอบเฉพาะความคิดเห็นเริ่มต้นของคุณ มันบอกว่ามีความแตกต่างอย่างมีนัยสำคัญระหว่างทั้งสอง OP มีความสนใจในความแตกต่าง ดังนั้นส่วนอื่น ๆ ของคำตอบก็คือตอบสนองความสนใจของ OP ในสองเรื่องนี้ มีเอฟเฟ็กต์ต่าง ๆ และมีเหตุผลสำหรับความแตกต่าง
LD James

9

>เป็นโอเปอเรเตอร์ของเชลล์เอาท์พุตที่ใช้ในการเปลี่ยนเส้นทาง STDOUT ของคำสั่งก่อนหน้านี้ไปยังไฟล์ descriptor ที่กล่าวถึงหลังจาก>นั้น หากไฟล์มีอยู่เนื้อหาของมันจะถูกตัดทอนเช่นเดียวกับไฟล์ที่open(2)มีO_TRUNCเครื่องหมายพร้อมกับแฟล็กและหากไฟล์ไม่มีอยู่ไฟล์นั้นจะถูกสร้างขึ้น

สิ่งสำคัญที่ควรทราบว่าตัวดำเนินการเปลี่ยนเส้นทางนี้จะได้รับการจัดการโดยเชลล์ก่อนที่คำสั่งก่อนหน้าจะรันดังนั้นจึงไม่ขึ้นอยู่กับคำสั่งใด ๆ และจัดการโดยเชลล์เอง

โปรดทราบว่าบางเชลล์ (เช่นzsh) จะทำงานแตกต่างจากการเปลี่ยนเส้นทางที่ว่างเปล่าเช่น:

 >file.txt

วิธีแก้ปัญหาทั่วไปคือการเพิ่มคำสั่ง:( true) no-op:

 : >file.txt

ตามเนื้อผ้าวัตถุประสงค์หลักของtouchคือการเปลี่ยนการประทับเวลาของไฟล์ไม่ได้สร้างไฟล์

touchสร้างไฟล์เฉพาะเมื่อไฟล์ที่กล่าวถึงในอาร์กิวเมนต์ไม่มีอยู่มิฉะนั้นจะเปลี่ยนเวลาการแก้ไขของไฟล์เป็นการประทับเวลาปัจจุบัน นอกจากนี้คุณยังสามารถเปลี่ยนเวลาในการเข้าถึงและเวลาการสร้าง inode touchใช้


zshจะสนับสนุนการเปลี่ยนเส้นทางที่ว่างเปล่า - มันทำหน้าที่คล้ายกันมากกับการเปลี่ยนเส้นทางcatโดยไม่มีการขัดแย้งกับไฟล์ โดยทั่วไปสิ่งที่คุณพิมพ์จะถูกเขียนลงในไฟล์จนกว่าจะมีอักขระ EOF หรือขัดจังหวะ สิ่งนี้สะท้อนzshพฤติกรรมของผู้ใช้เพียง<fileแค่พิมพ์เนื้อหาของไฟล์เช่นเดียวกับที่catทำ สิ่งเหล่านี้อาจกำหนดค่าได้ฉันได้เห็น<fileเปิดไฟล์ในเพจเจอร์
8bittree

@ 8bittree สิ่งที่ฉันหมายถึงคือคุณจำเป็นต้องป้อนข้อมูลEOF(เช่นทำcat >file.txtตามที่คุณพูด) ซึ่งbashการทำเช่น>file.txtนั้นจะเพียงพอ
heemayl

ยุติธรรมพอฉันแนะนำการแก้ไขที่ฉันคิดว่าทำให้เข้าใจได้ชัดเจนยิ่งขึ้น
8bittree

@ 8bittree อนุมัติแล้ว
heemayl

(1) โดยค่าเริ่มต้นtouchอัปเดตทั้งเวลาแก้ไขและเวลาเข้าถึงของไฟล์ มีตัวเลือกให้อัปเดตหนึ่งรายการเท่านั้น (2) Unix / Linux / POSIX ไม่รองรับ“ เวลาสร้างไอโหนด” โดยทั่วไป ระบบไฟล์บางประเภทรองรับ แต่ไม่มีวิธีสากลที่จะมองหาให้แก้ไขเพียงอย่างเดียว คุณสามารถให้การอ้างอิงที่ระบุว่ามีชาติtouchที่อนุญาตให้ผู้ใช้เปลี่ยนเวลาสร้าง inode ได้หรือไม่?
สกอตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.