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สร้างไฟล์ใหม่ที่มีเนื้อหาเดียวกัน