เมื่อสร้างไฟล์ว่างเหตุใดจึงอาจต้องการ 'ไฟล์สัมผัส' มากกว่า ': >> ไฟล์'


33

ไม่เคยรู้เลยว่าคุณสามารถทำได้จนถึงตอนนี้:

: >> file

ดูเหมือนว่าจะมีฟังก์ชันคล้ายกับ:

touch file

มีเหตุผลที่ทรัพยากรส่วนใหญ่ดูเหมือนจะชอบมากกว่าการสัมผัสเปลือกนี้ในตัว?


7
รูปแบบย่ออาจเกี่ยวข้องกับเชลล์ในขณะที่ touch เป็นคำสั่งแบบสแตนด์อโลน ดังนั้นรูปแบบสั้น ๆ ขึ้นอยู่กับว่าคุณใช้เชลล์แบบไหน (และผู้คนมีความพึงพอใจอย่างมากในพื้นที่นี้) เนื่องจากอาจไม่ใช่ทุกคนที่มีทางลัด touchความเป็นอิสระจะทำงานในลักษณะเดียวกับที่คุณควรใช้
Patrick Mevzek


6
ตัวอย่างแรกควรได้รับการแก้ไข: >> fileหรือแม้กระทั่ง>> fileเพื่อให้มีผลเหมือนกันคือไม่ทำลายเนื้อหาของไฟล์
user000001

2
touchอัพเดต mtime เป็นหลัก >มันไม่ได้ล้างไฟล์ที่มีอยู่ซึ่งแตกต่างจาก
rexkogitans

2
ทั้งคำสั่ง "สร้างไฟล์ว่าง"; พวกเขาจะได้ผลลัพธ์นี้ถ้าไฟล์ยังไม่มีอยู่ ในการรับประกันไฟล์ว่างคุณต้อง> fileใช้
alexis

คำตอบ:


47

คุณไม่จำเป็นต้องใช้งานง่ายแม้:; คุณสามารถทำได้> file(อย่างน้อยก็ในbash; เชลล์อื่นอาจทำงานแตกต่างกัน)

ในแง่การปฏิบัติไม่มีความแตกต่างที่แท้จริงที่นี่ (แม้ว่าค่าใช้จ่าย/bin/touchเล็กน้อยของการเรียกร้องให้เป็นสิ่ง)

touchอย่างไรก็ตามยังสามารถใช้เพื่อแก้ไขการประทับเวลาในไฟล์ที่มีอยู่แล้วโดยไม่ต้องเปลี่ยนหรือลบเนื้อหา เพิ่มเติม> fileจะระเบิดสิ่งfileที่มีอยู่แล้ว >> fileนี้สามารถทำงานรอบโดยแทนการใช้

ความแตกต่างอีกอย่างหนึ่งtouchคือคุณสามารถสร้าง (หรืออัปเดตการประทับเวลาเปิด) หลายไฟล์พร้อมกัน (เช่นtouch foo bar baz quux) ด้วยไวยากรณ์ที่กระชับยิ่งขึ้นกว่าการเปลี่ยนเส้นทางที่แต่ละไฟล์ต้องการการเปลี่ยนเส้นทางของตัวเอง (เช่น>foo >bar >baz >quux)

การใช้touch:

$ touch foo; stat -x foo; sleep 2; touch foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:19 2018
Modify: Fri May 25 10:55:19 2018
Change: Fri May 25 10:55:19 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:55:21 2018
Change: Fri May 25 10:55:21 2018

ใช้การเปลี่ยนเส้นทาง:

$ > foo; stat -x foo; sleep 2; >> foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018

6
ดูเหมือนว่า>> fileจะไม่อัปเดตเวลาแก้ไข ไม่ใช่สิ่งที่ OP ต้องการ แต่เพียงต้องการชี้ให้เห็นว่าดูเหมือนจะไม่ใช่ทางเลือกที่สมบูรณ์แบบสำหรับการสัมผัส
Jesse_b

2
เนื่องจากคำถามไม่ได้ระบุเปลือกเฉพาะ มันอาจจะดีที่จะชี้ให้เห็นว่า> fileใน zsh เทียบเท่ากับการไม่ได้cat > file : > file
JoL

นอกจากนี้ยังช่วยให้ tcsh : > fileแต่ errs > fileบน บางทีความเท่าเทียมกันของ> fileการ: > fileถูก จำกัด ไว้ที่บอร์นเชลล์และทุบตี?
JoL

+1 สำหรับทั่วถึงอย่างไรก็ตามทราบว่าในเปลือกหอยหลายหลัก (ฉันก็จะคิดว่าทั้งหมดหรือเปลือกมากที่สุดเพราะการดำเนินงานที่ง่ายที่สุดธรรมชาติจะก่อให้เกิดการทำงานเป็นผลข้างเคียง) คุณสามารถสัมผัสหลายไฟล์โดยใช้การเปลี่ยนเส้นทางเปลือก: : >foo >barหรือ: >>foo >>barจะ สัมผัสทั้งสองและfoo bar
mtraceur

เพียงเพื่อจะอวดความรู้เพราะบริบทของคำถามจริงที่นี่ แต่: >foo >barจะไม่touchไฟล์; มันจะเปลี่ยนเส้นทางการส่งออก (null) ของ: ลงในไฟล์ touchจะสัมผัสไฟล์ (:
DopeGhoti

32

เพราะคุณสามารถtouchหลายไฟล์พร้อมกันโดยไม่ต้องพิมพ์อักขระพิเศษใด ๆ touch file{1,2,3,4}ซึ่งรวมถึงสิ่งที่ชอบการขยายตัวรั้งเช่น

อีกปัญหาหนึ่งคือเมื่อคุณเขียนบทช่วยสอนสิ่งสำคัญคือการตระหนักว่าผู้อ่านของคุณอาจไม่รอบรู้เรื่องนี้มากนัก คำสั่งง่าย ๆ สามารถเข้าใจได้ง่ายกว่าชุดอักขระที่ไม่ใช่ตัวอักษรที่ดูแปลก ๆ ฉันคาดหวังว่าจะมีผู้ใช้งานเชลล์จำนวนมากที่ไม่ทราบว่า:เป็นเพราะเหตุผลง่ายๆที่ไม่ได้ทำอะไรเลย ในทำนองเดียวกันสำหรับธรรมดาที่> fooไม่มีคำสั่ง: แม้ว่าคุณจะรู้ว่าการเปลี่ยนเส้นทางคืออะไรการเปลี่ยนเส้นทางโดยไม่มีแหล่งที่มาอาจไม่ได้ใช้งานง่าย

นอกจากนี้ที่นี่บน unix.se เรามักจะเขียนตัวอย่างคำสั่งด้วยเครื่องหมายดอลลาร์ชั้นนำเพื่อระบุพรอมต์ อักขระพิเศษที่จุดเริ่มต้นของบรรทัดอาจสับสนกับเรื่องนั้น (โปรดทราบว่ามีระบบและเชลล์ที่ใช้>เป็นส่วนหนึ่งของพรอมต์เริ่มต้น)


4
และหากคำสั่งนั้นไม่เข้าใจอย่างสมบูรณ์จะมี "การสัมผัสของมนุษย์" อยู่เสมอ ฉันสงสัยว่า "man:> file" จะส่งคืนสิ่งที่มีประโยชน์ :-) พร้อมต์ WRT บางตัว (อาจมากที่สุด) ให้คุณตั้งค่าพรอมต์ให้เป็นอะไรก็ได้ที่คุณต้องการ Mine แสดงชื่อระบบ (เพราะฉันใช้ xterms ระยะไกลจำนวนมาก) และไดเรกทอรีปัจจุบันและตั้งค่าเป็นสีที่แตกต่างกันสำหรับระบบที่แตกต่างกัน
jamesqf

1
@jamesqf, อ๋อ ตอนนี้แน่นอนว่ายังมีhelp :หรือสิ่งที่เปลือกของคุณมีสำหรับเอกสาร แต่นั่นต้องจำไว้:ว่าเป็นคำสั่งในตัวเองจำไว้ว่าไม่ใช่ทุกอย่างที่มี man page และในที่สุดก็สามารถค้นหาได้:ในเอกสาร ส่วนสุดท้ายนั้นค่อนข้างยาก : D
ilkkachu

@jamesqf และใช่ฉันส่วนใหญ่หมายถึงอักขระสุดท้ายของพรอมต์เริ่มต้น
ilkkachu

1
+1 สำหรับการชี้ให้เห็นถึงลักษณะปรีชาและไม่เป็น - an - ปิดบังสร้าง
mtraceur

@ilkkachu: ใช่ การหาโคลอนในเอกสารนั้นไม่ใช่เรื่องยาก: การหาอันที่ไม่ใช่แค่เครื่องหมายวรรคตอนเป็นเรื่องที่แตกต่าง :-)
jamesqf

18

สำหรับฉันเหตุผลหลักคือความสามารถในการอ่าน เมื่อtouch fileคุณรู้ว่าเกิดอะไรขึ้นแม้แต่คนที่ไม่ค่อยมีการศึกษาเรื่องการเขียนสคริปต์ก็รู้ว่าเกิดอะไรขึ้น และถ้าไม่ใช่มันง่ายที่จะทำman touchและดู:

A FILE argument that does not exist is created empty

ด้วยสิ่งที่คลุมเครือเช่น:และ>มันยากที่จะรู้ว่าเกิดอะไรขึ้นและเนื่องจากไม่มีข้อได้เปรียบที่แท้จริงจึงไม่จำเป็นต้องใช้สิ่งนั้น


6

ลองนึกภาพว่าคุณกำลังค้นหาเชลล์สคริปต์เก่าตัวหนึ่งซึ่งคุณจำได้ว่ามีไฟล์มาร์กเกอร์บางไฟล์ใน / tmp กำลังสร้าง ง่ายต่อการ grep ไฟล์ * .sh ทั้งหมดของคุณสำหรับคำว่า "touch" การใส่เครื่องหมายโคลอนลงในลำไส้ใหญ่แทนจะให้ผลบวกปลอมหลายอย่างถ้าคุณไม่รู้ชื่อไฟล์ที่แน่นอนในการค้นหา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.