cp vs. cat เพื่อคัดลอกไฟล์


12

cp a bและcat a > bอะไรคือความแตกต่าง?

ในสคริปต์การติดตั้ง x86 ของซอร์สต้นไม้ของ linux kernel ( arch/x86/boot/install.sh) จะใช้ทั้งคู่:

cat $2 > $4/vmlinuz
cp $3 $4/System.map

เหตุใดพวกเขาจึงไม่คงรูปแบบเดียวกันหากดีกว่าอีกรูปแบบหนึ่ง

คำตอบ:


15

ปัญหาอีกอย่างหนึ่งอยู่ในใจของฉันcatเมื่อเทียบกับที่cpสร้างความแตกต่างที่สำคัญ:

ตามคำจำกัดความแมวจะขยายไฟล์กระจัดกระจายเติมช่องว่างด้วยไบต์ "ของจริง" ในขณะที่ cp อย่างน้อยสามารถบอกได้ว่าจะรักษาหลุม

ไฟล์ที่กระจัดกระจายเป็นไฟล์ที่ลำดับของศูนย์ไบต์ถูกแทนที่ด้วยเมตาดาต้าเพื่อรักษาพื้นที่ คุณสามารถทดสอบได้ด้วยการสร้างขึ้นมาด้วย dd และสร้างซ้ำด้วยเครื่องมือที่คุณเลือก

  1. สร้างไฟล์ 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
  2. ปรับขนาด - ไม่ควรใช้พื้นที่

    17> du -sh sparsetest
    0       sparsetest
  3. คัดลอกด้วย cp และตรวจสอบขนาด

    18> cp sparsetest sparsecp
    19> du -sh sparsecp
    0       sparsecp
  4. ตอนนี้คัดลอกด้วย cat และตรวจสอบขนาด

    20> cat sparsetest > sparsecat
    21> du -sh sparsecat
    1.3M    sparsecat
  5. ลองใช้เครื่องมือที่คุณต้องการเพื่อตรวจสอบพฤติกรรมของพวกเขา

  6. อย่าลืมทำความสะอาด

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

ไฟล์อื่นที่ไม่สามารถคัดลอกด้วย cat หรือ cp จะไม่รวมไฟล์พิเศษของอุปกรณ์ ฯลฯ ขึ้นอยู่กับการใช้งานของเครื่องมือคัดลอกหากสามารถทำซ้ำโหนดอุปกรณ์หรือถ้ามันจะคัดลอกเนื้อหาอย่างสนุกสนานแทน


1
ดังนั้นcpทำให้ไฟล์เหมือนเดิมในขณะที่การcatสร้างไฟล์ใหม่ที่มีเนื้อหาเดียวกัน
Qian

เครื่องมือทั้งสองทำงานกับเนื้อหา แต่ cp (อย่างน้อยการใช้งาน "สมัยใหม่") ได้ตระหนักถึงความพิเศษบางอย่างในปัจจุบันเช่นรู (การใช้งานแบบเก่าของแมวจะวิ่งเข้าไปในกับดักนั้น) นอกจากนี้ยังมีระบบไฟล์ที่ไม่ทราบแนวคิดของไฟล์ที่กระจัดกระจายเช่น HFS + (MacOS) หรือ FAT (MSDOS, USB-Sticks, ฯลฯ ) ทำให้พวกเขาถูกเป่าจนเต็มขนาด ดังนั้นจึงมีกลุ่มดาวที่ cp หรือแมวจะไม่สร้างความแตกต่างในทางปฏิบัติ
Tatjana Heuser

Btw, GNU cpมีตัวเลือกสำหรับควบคุมพฤติกรรมของไฟล์แบบกระจาย เช่นกับ--sparse=neverที่ระบุไว้บนบรรทัดคำสั่งเป็นช้าเป็นcp cat
oguz ismail

6

ตามความคิดเห็นของคี ธ , cpเก็บรักษาสิทธิ์บางส่วนและcatสร้างแฟ้มใหม่ที่umaskบ่งชี้ว่า ดังนั้น$2's ได้รับอนุญาตไม่ได้เก็บรักษาไว้ที่$4/vmlinuzสะอาดสวยในขณะที่ถ้าบางคนได้รับอนุญาตแปลกตั้งอยู่บน$3, $4/System.mapจะเก็บที่


นั่นคือเหตุผลที่ทำให้ความไม่แน่นอนของคุณลักษณะcatหรือไม่
Nikhil Mulley

2
คือcatได้เร็วขึ้น?
Qian

4

ทั้งสองมีฟังก์ชันการทำงานที่เทียบเท่าในทั้งสองกรณี แต่ cp เป็นการดำเนินงานไฟล์อย่างแท้จริง msgstr "เอาแฟ้มนี้ไปทำสำเนาตรงนั้น".

cat ในทางกลับกันมีวัตถุประสงค์เพื่อดัมพ์เนื้อหาของไฟล์ออกไปยังคอนโซล "เอาไฟล์นี้ไปแสดงบนหน้าจอ" จากนั้นให้นินจาโจมตีหน้าจอแล้วเปลี่ยนเส้นทางไปที่อื่น

cp โดยทั่วไปจะมีประสิทธิภาพมากกว่าเนื่องจากไม่มีการเปลี่ยนเส้นทางไปเพียงแค่คัดลอกไบต์โดยตรงจากตำแหน่ง A ไปยังตำแหน่ง B

read bytes -> output to console -> intercept output -> redirect to new fileแมวจะ


3
catจะไม่จริงoutput to console -> intercept output -> redirect to new fileไฟล์ส่งออกสำหรับ cat สามารถ stdout หรือไฟล์ปกติมันจะเพียงแค่ส่งออกไปยังไฟล์ตราบใดที่อินพุตไม่เหมือนกับเอาท์พุท

4
catไม่มีอะไรเกี่ยวข้องกับคอนโซล ทั้งcatและcpอ่านจากไฟล์อินพุตและเขียนไปยังไฟล์เอาต์พุต ด้วยcat, ไฟล์เอาต์พุตถูกเปิดโดยเชลล์, ในขณะที่cp, ไฟล์เอาต์พุตถูกเปิดโดยcp; สิ่งนี้ทำให้ประสิทธิภาพไม่แตกต่างกัน cpอาจเร็วกว่า แต่ด้วยเหตุผลที่แตกต่างอย่างสิ้นเชิง: การใช้งานบางอย่างของcpการคาดเดาขนาดอันเหมาะสมสำหรับประสิทธิภาพขึ้นอยู่กับอุปกรณ์ต้นทางและอุปกรณ์เป้าหมาย การดำเนินการของcatจะไม่รบกวน
Gilles 'หยุดความชั่วร้าย'

2

มันเป็นเรื่องของการตั้งค่า IMHO

ในทางเทคนิคแล้วไม่มีความแตกต่างจริงยกเว้นว่าคุณใช้คำสั่ง cp กับสวิตช์ -p เพื่อสงวนความเป็นเจ้าของไฟล์ / กลุ่ม มิฉะนั้นมันก็เป็นหน้าที่เดียวกัน คำตอบของ Marc นั้นชัดเจนและชัดเจนยิ่งขึ้น


3
cpโดย-pไม่รักษาสิทธิ์บางอย่าง ตัวอย่างเช่นหากไฟล์ต้นฉบับนั้นสามารถเรียกทำงานได้cpจะทำให้ไฟล์เป้าหมายนั้นทำงานได้ แต่catจะไม่ทำงาน
Keith Thompson

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