cp a b
และcat a > b
อะไรคือความแตกต่าง?
ในสคริปต์การติดตั้ง x86 ของซอร์สต้นไม้ของ linux kernel ( arch/x86/boot/install.sh
) จะใช้ทั้งคู่:
cat $2 > $4/vmlinuz
cp $3 $4/System.map
เหตุใดพวกเขาจึงไม่คงรูปแบบเดียวกันหากดีกว่าอีกรูปแบบหนึ่ง
cp a b
และcat a > b
อะไรคือความแตกต่าง?
ในสคริปต์การติดตั้ง x86 ของซอร์สต้นไม้ของ linux kernel ( arch/x86/boot/install.sh
) จะใช้ทั้งคู่:
cat $2 > $4/vmlinuz
cp $3 $4/System.map
เหตุใดพวกเขาจึงไม่คงรูปแบบเดียวกันหากดีกว่าอีกรูปแบบหนึ่ง
คำตอบ:
ปัญหาอีกอย่างหนึ่งอยู่ในใจของฉันcat
เมื่อเทียบกับที่cp
สร้างความแตกต่างที่สำคัญ:
ตามคำจำกัดความแมวจะขยายไฟล์กระจัดกระจายเติมช่องว่างด้วยไบต์ "ของจริง" ในขณะที่ cp อย่างน้อยสามารถบอกได้ว่าจะรักษาหลุม
ไฟล์ที่กระจัดกระจายเป็นไฟล์ที่ลำดับของศูนย์ไบต์ถูกแทนที่ด้วยเมตาดาต้าเพื่อรักษาพื้นที่ คุณสามารถทดสอบได้ด้วยการสร้างขึ้นมาด้วย dd และสร้างซ้ำด้วยเครื่องมือที่คุณเลือก
สร้างไฟล์ sparse (เปลี่ยนเป็น / tmp ล่วงหน้าเพื่อหลีกเลี่ยงปัญหา - ดูหมายเหตุสุดท้าย):
15> cd /tmp
16> dd if=/dev/null of=sparsetest bs=512b seek=5
0+0 records in
0+0 records out
0 bytes (0 B) copied, 5.9256e-05 s, 0.0 kB/s
ปรับขนาด - ไม่ควรใช้พื้นที่
17> du -sh sparsetest
0 sparsetest
คัดลอกด้วย cp และตรวจสอบขนาด
18> cp sparsetest sparsecp
19> du -sh sparsecp
0 sparsecp
ตอนนี้คัดลอกด้วย cat และตรวจสอบขนาด
20> cat sparsetest > sparsecat
21> du -sh sparsecat
1.3M sparsecat
ลองใช้เครื่องมือที่คุณต้องการเพื่อตรวจสอบพฤติกรรมของพวกเขา
อย่าลืมทำความสะอาด
ข้อควรระวังในขั้นสุดท้าย: การทดลองในลักษณะนี้มีโอกาสที่จะเพิ่มชื่อเสียงของคุณด้วยระบบดูแลระบบในพื้นที่ของคุณหากคุณทำในระบบไฟล์ซึ่งเป็นส่วนหนึ่งของแผนการสำรองข้อมูลของเขาหรือเป็นสิ่งสำคัญสำหรับความเป็นอยู่ของระบบ เขาอาจจำเป็นต้องใช้สื่อเทปมากกว่าที่เขาเคยคิดว่าเป็นไปได้ในการสำรองไฟล์ 0 ไบต์หนึ่งไฟล์ซึ่งขยายเป็นเทราไบต์
ไฟล์อื่นที่ไม่สามารถคัดลอกด้วย cat หรือ cp จะไม่รวมไฟล์พิเศษของอุปกรณ์ ฯลฯ ขึ้นอยู่กับการใช้งานของเครื่องมือคัดลอกหากสามารถทำซ้ำโหนดอุปกรณ์หรือถ้ามันจะคัดลอกเนื้อหาอย่างสนุกสนานแทน
cp
มีตัวเลือกสำหรับควบคุมพฤติกรรมของไฟล์แบบกระจาย เช่นกับ--sparse=never
ที่ระบุไว้บนบรรทัดคำสั่งเป็นช้าเป็นcp
cat
ตามความคิดเห็นของคี ธ , cp
เก็บรักษาสิทธิ์บางส่วนและcat
สร้างแฟ้มใหม่ที่umask
บ่งชี้ว่า ดังนั้น$2
's ได้รับอนุญาตไม่ได้เก็บรักษาไว้ที่$4/vmlinuz
สะอาดสวยในขณะที่ถ้าบางคนได้รับอนุญาตแปลกตั้งอยู่บน$3
, $4/System.map
จะเก็บที่
cat
หรือไม่
cat
ได้เร็วขึ้น?
ทั้งสองมีฟังก์ชันการทำงานที่เทียบเท่าในทั้งสองกรณี แต่ cp เป็นการดำเนินงานไฟล์อย่างแท้จริง msgstr "เอาแฟ้มนี้ไปทำสำเนาตรงนั้น".
cat ในทางกลับกันมีวัตถุประสงค์เพื่อดัมพ์เนื้อหาของไฟล์ออกไปยังคอนโซล "เอาไฟล์นี้ไปแสดงบนหน้าจอ" จากนั้นให้นินจาโจมตีหน้าจอแล้วเปลี่ยนเส้นทางไปที่อื่น
cp โดยทั่วไปจะมีประสิทธิภาพมากกว่าเนื่องจากไม่มีการเปลี่ยนเส้นทางไปเพียงแค่คัดลอกไบต์โดยตรงจากตำแหน่ง A ไปยังตำแหน่ง B
read bytes -> output to console -> intercept output -> redirect to new file
แมวจะ
cat
จะไม่จริงoutput to console -> intercept output -> redirect to new file
ไฟล์ส่งออกสำหรับ cat สามารถ stdout หรือไฟล์ปกติมันจะเพียงแค่ส่งออกไปยังไฟล์ตราบใดที่อินพุตไม่เหมือนกับเอาท์พุท
cat
ไม่มีอะไรเกี่ยวข้องกับคอนโซล ทั้งcat
และcp
อ่านจากไฟล์อินพุตและเขียนไปยังไฟล์เอาต์พุต ด้วยcat
, ไฟล์เอาต์พุตถูกเปิดโดยเชลล์, ในขณะที่cp
, ไฟล์เอาต์พุตถูกเปิดโดยcp
; สิ่งนี้ทำให้ประสิทธิภาพไม่แตกต่างกัน cp
อาจเร็วกว่า แต่ด้วยเหตุผลที่แตกต่างอย่างสิ้นเชิง: การใช้งานบางอย่างของcp
การคาดเดาขนาดอันเหมาะสมสำหรับประสิทธิภาพขึ้นอยู่กับอุปกรณ์ต้นทางและอุปกรณ์เป้าหมาย การดำเนินการของcat
จะไม่รบกวน
มันเป็นเรื่องของการตั้งค่า IMHO
ในทางเทคนิคแล้วไม่มีความแตกต่างจริงยกเว้นว่าคุณใช้คำสั่ง cp กับสวิตช์ -p เพื่อสงวนความเป็นเจ้าของไฟล์ / กลุ่ม มิฉะนั้นมันก็เป็นหน้าที่เดียวกัน คำตอบของ Marc นั้นชัดเจนและชัดเจนยิ่งขึ้น
cp
โดย-p
ไม่รักษาสิทธิ์บางอย่าง ตัวอย่างเช่นหากไฟล์ต้นฉบับนั้นสามารถเรียกทำงานได้cp
จะทำให้ไฟล์เป้าหมายนั้นทำงานได้ แต่cat
จะไม่ทำงาน
cp
ทำให้ไฟล์เหมือนเดิมในขณะที่การcat
สร้างไฟล์ใหม่ที่มีเนื้อหาเดียวกัน