เหตุใดคำสั่งนี้จึงสร้างไฟล์ขนาดใหญ่มหาศาล


19

ฉันกำลังทดลองวันนี้ด้วยการดำเนินการผนวกและในความอยากรู้ของฉันวิ่งนี้ (ที่file1.txtไม่ว่างเปล่าและfile2.txtว่างเปล่า):

$ cat file1.txt >> file2.txt >> file1.txt

เมื่อฉันเห็นมันใช้เวลาซักพักฉันก็กดCtrl+ Cเพื่อจบมัน จากนั้นfile1.txtมีขนาดหลายร้อย MB

การสลับชื่อไฟล์ไม่ได้ให้ผลเช่นเดียวกัน เฉพาะเมื่อไฟล์อยู่ในลำดับนี้จะเกิดการเปลี่ยนเส้นทางไม่สิ้นสุด เกิดอะไรขึ้นที่ทำให้เกิดสิ่งนี้

คำตอบ:


24

คุณไม่สามารถบอกได้ว่าcatจะใช้หลายมาตรฐานในแบบนั้นการเปลี่ยนเส้นทางครั้งล่าสุดจะมีความสำคัญมากกว่าดังนี้:

cat file1.txt >> file2.txt >> file1.txt

เทียบเท่ากับ:

>> file2.txt ; cat file1.txt >> file1.txt

ซึ่งเห็นได้ชัดว่าเติมระบบไฟล์อย่างรวดเร็วเนื่องจากความจริงแล้วไฟล์ต้นฉบับที่เป็นปลายทางก็มีfile1.txtขนาดใหญ่ขึ้นเรื่อย ๆ หากมีขนาดใหญ่พอที่จะไม่สามารถอ่านได้ในครั้งเดียว

catการใช้งานที่ทันสมัยส่วนใหญ่ควรตรวจสอบซ้ำและยกเลิก:

แมว Solaris:

cat: input/output files 'file1.txt' identical

แมว Gnu:

cat: file1.txt: input file is output file

พวกเขาสามารถถูกหลอกด้วยสิ่งที่ชอบ:

cat < file1.txt | cat | cat  >> file2.txt >> file1.txt

แมวที่ใช้ไม่ได้ผลดี ...


19
นั่นคือแมวจำนวนมาก meow
slm

2
คุณทำให้หัวฉันหมุน แต่คุณตอบคำถามของฉัน!
Matt

7
และเมื่อฉันถามเกี่ยวกับสิ่งนี้ใน Google+ (ไม่ได้รับคำตอบ) มันจะติดแท็กโพสต์ของฉันโดยอัตโนมัติด้วย#Catและ#Caturday
Matt

3

ฉันไม่สามารถทำซ้ำสิ่งนี้ในเปลือก Bash:

# non-empty file1
$ echo 1 > file1.txt

$ cat file1.txt >> file2.txt >> file1.txt 
cat: file1.txt: input file is output file

1 ไฟล์ถูกสร้างด้วยความยาว 0 แต่จากนั้นฉันจะได้รับข้อความด้านบน:

$ ls -l
total 4
-rw-rw-r-- 1 saml saml   2 Sep 10 19:35 file1.txt
-rw-rw-r-- 1 saml saml   0 Sep 10 19:35 file2.txt

จากคำตอบของ @ jlliagre ฉันไม่แน่ใจว่าทำไมฉันถึงได้รับ 2 ไฟล์ มันอาจขึ้นอยู่กับการcatใช้งาน

แก้ไข # 1

@jlliagre อัปเดตคำตอบของเขาเพื่อแสดงรหัสนี้ซึ่งเขาระบุว่าเทียบเท่า:

>> file2.txt ; cat file1.txt >> file1.txt

file2.txtดังนั้นตอนนี้ฉันรู้ว่าทำไมฉันได้รับที่ว่างเปล่า สัญลักษณ์นี้ถูกกฎหมาย:

>> file2.txt

และจะสร้างไฟล์เปล่า


ลองอีกครั้งโดยfile1.txtเริ่มที่ไม่ว่างเปล่า
Gilles 'หยุดชั่วร้าย'

@Gilles - ฉันเพิ่งอ่านมันอีกครั้งและสังเกตว่าฉันควรจะเห็นสิ่งที่แตกต่างกันฉันยังคงได้รับข้อผิดพลาด? หรือคุณเพียงแค่บอกว่า b / c ตัวอย่างในคำตอบของฉันไม่ถูกต้อง? ฉันแก้ไขคำตอบ BTW
slm

@Gilles - นั่นคือ downvote ของคุณใช่ไหม มันเป็นเพียงสิ่งที่เฉพาะเจาะจงหรือขาดคุณค่าของคำตอบ?
slm

1
ไม่แน่ใจว่าทำไมคำตอบของคุณได้รับการโหวตลง +1 สำหรับประสบการณ์ก่อนที่จะตอบบางสิ่งที่ฉันไม่ได้ทำด้วยตัวเอง ...
jlliagre

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