เหตุใดไดเร็กทอรีจึงถูกคัดลอกด้วยคำสั่ง cp เล็กกว่าต้นฉบับ?


18

ฉันคาดว่าจะคัดลอกหนึ่งไดเรกทอรีที่มีไฟล์จำนวนมากไปยังปลายทางอื่น ฉันทำ:

cp -r src_dir another_destination/

จากนั้นฉันต้องการยืนยันว่าขนาดของไดเรกทอรีปลายทางนั้นเหมือนกับไดเรกทอรีต้นฉบับ:

du -s src_dir
3782288 src_dir

du -s another_destination/src_dir
3502320 another_destination/src_dir

จากนั้นฉันคิดว่าอาจมีลิงก์สัญลักษณ์หลายรายการที่ไม่ได้ตามด้วยcpคำสั่งและเพิ่มการ-aตั้งค่าสถานะ:

- เช่นเดียวกับตัวเลือก -pPR เก็บรักษาโครงสร้างและคุณสมบัติของไฟล์ แต่ไม่ใช่โครงสร้างไดเร็กทอรี

cp -a src_dir another_destination/

แต่du -sให้ผลลัพธ์เดียวกัน เป็นที่น่าสนใจว่าทั้งต้นทางและปลายทางมีจำนวนไฟล์และไดเรกทอรีเท่ากัน:

tree src_dir | wc -l
    4293

tree another_destination/src_dir | wc -l
    4293

ฉันทำอะไรผิดที่ได้ขนาดต่าง ๆ ด้วยduคำสั่ง?

UPDATE

เมื่อฉันพยายามรับขนาดของแต่ละไดเรกทอรีด้วยduคำสั่งฉันได้ผลลัพธ์ที่แตกต่างกัน:

du -s src_dir/sub_dir1
1112    src_dir/sub_dir1

du -s another_destination/src_dir/sub_dir1
1168    another_destination/src_dir/sub_dir1

เมื่อฉันดูไฟล์ด้วยls -laขนาดไฟล์แต่ละไฟล์จะเท่ากัน แต่ผลรวมจะแตกต่างกัน:

ls -la src_dir/sub_dir1
total 1168
drwxr-xr-x     5 hirurg103  staff     160 Jan 30 20:58 .
drwxr-xr-x  1109 hirurg103  staff   35488 Jan 30 21:43 ..
-rw-r--r--     1 hirurg103  staff  431953 Jan 30 20:58 file1.pdf
-rw-r--r--     1 hirurg103  staff  126667 Jan 30 20:54 file2.png
-rw-r--r--     1 hirurg103  staff    7386 Jan 30 20:49 file3.png

ls -la another_destination/src_dir/sub_dir1
total 1112
drwxr-xr-x     5 hirurg103  staff     160 Jan 30 20:58 .
drwxr-xr-x  1109 hirurg103  staff   35488 Jan 30 21:43 ..
-rw-r--r--     1 hirurg103  staff  431953 Jan 30 20:58 file1.pdf
-rw-r--r--     1 hirurg103  staff  126667 Jan 30 20:54 file2.png
-rw-r--r--     1 hirurg103  staff    7386 Jan 30 20:49 file3.png

1
คำถามที่น่าสนใจ เป็นไดรฟ์ต่าง ๆ ที่มาและปลายทางต่าง ๆ / ฉันหมุนขึ้นหรือไม่ถ้านี่เป็นขนาดบล็อกของระบบไฟล์
davidgo

สวัสดี @davidgo แหล่งที่มาและปลายทางคือไดเรกทอรีต่าง ๆ ในไดรฟ์เดียวกัน ฉันอัปเดตคำถามพร้อมls -laผลลัพธ์ ดูข้อมูลล่าสุด
Hirurg103

2
ระบบไฟล์อะไร มันอาจจะเป็นไดเรกทอรีที่ตัวเองมีขนาดใหญ่ (ใช้พื้นที่มากขึ้น) กว่าที่พวกเขาต้องการ เปรียบเทียบคำถามนี้ ไดเรกทอรีใหม่ที่สร้างขึ้นcpนั้นใหญ่พอ ๆ กับที่พวกเขาต้องการ
Kamil Maciorowski

ใช้ls -lsเพื่อดูจำนวนไฟล์ที่ใช้ในพื้นที่ดิสก์
Barmar

1
recursive md5sum คือเพื่อนของคุณเมื่อคุณต้องการตรวจสอบว่าไฟล์ทั้งหมดจะถูกคัดลอกจริงและเนื้อหาเหมือนกัน rsync เป็นเครื่องมืออีกตัวที่สามารถคัดลอกและตรวจสอบโครงสร้างและไฟล์ทั้งหมดและเร่งความเร็วกระบวนการหากไฟล์บางไฟล์มีอยู่แล้ว
GoFundMonica - codidact.org

คำตอบ:


21

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

% printf test123 > a
% ls -l a
-rw-r--r-- 1 mnalis mnalis 7 Feb  1 19:57 a
% du -h a
4,0K    a
% du -hb a
7       a

แม้ว่าไฟล์จะมีความยาวเพียง 7 ไบต์ แต่จะมีพื้นที่ดิสก์ทั้งหมด 4096 ไบต์ (ในตัวอย่างเฉพาะของฉันมันจะแตกต่างกันไปขึ้นอยู่กับระบบไฟล์ที่ใช้ขนาดคลัสเตอร์ ฯลฯ )

นอกจากนี้ระบบไฟล์บางระบบยังรองรับไฟล์ sparse ซึ่งไม่ใช้พื้นที่ดิสก์ใด ๆ สำหรับบล็อกที่เป็นศูนย์ทั้งหมด ตัวอย่างเช่น:

% dd if=/dev/zero of=regular.bin bs=4k count=10
10+0 records in
10+0 records out
40960 bytes (41 kB, 40 KiB) copied, 0,000131003 s, 313 MB/s
% cp --sparse=always regular.bin sparse.bin
% ls -l *.bin
-rw-r--r-- 1 mnalis mnalis 40960 Feb  1 20:04 regular.bin
-rw-r--r-- 1 mnalis mnalis 40960 Feb  1 20:04 sparse.bin
% du -h *.bin
40K     regular.bin
0       sparse.bin
% du -hb *.bin
40960   regular.bin
40960   sparse.bin

ในระยะสั้นในการตรวจสอบไฟล์ทั้งหมดที่ถูกคัดลอกคุณต้องการใช้แทนdu -sbdu -s


1
ไม่เพียงแต่ไฟล์กระจัดกระจายแต่ไฟล์บีบอัดและไฟล์อินไลน์ / ไฟล์ที่อยู่อาศัยยังทำให้ขนาดของดิสก์มีขนาดเล็กกว่าขนาดไฟล์
phuclv

1
และผลลัพธ์แปลก ๆ บน btrfs / zfs
val พูดว่า Reinstate Monica

2
@val: การบีบอัด BTRFS ไม่ส่งผลกระทบต่อduเอาต์พุต: นั่นจะทำให้ไฟล์บีบอัดดูกระจัดกระจายไปยังโปรแกรมที่ใช้อัลกอริธึมความยาวปกติ! = ใช้บล็อค btrfs.wiki.kernel.org/index.php/…
Peter Cordes

@PeterCordes แต่สิ่งที่ CoW ทำให้การส่งออก du หมดสติไป
val พูดว่า Reinstate Monica

ไฟล์ที่ซ้ำกันเป็นอย่างไร ระบบที่ทันสมัยไม่สามารถประหยัดพื้นที่ด้วยการรับรู้เนื้อหาที่ซ้ำกันหรือไม่
FreeSoftwareServers

12

อาจเป็นเพราะขนาดของไดเรกทอรี "ไฟล์"

ในระบบไฟล์ส่วนใหญ่บนดิสก์ไดเร็กตอรี่นั้นเหมือนกับไฟล์ปกติ (โดยมีเพียงรายชื่อและหมายเลขโหนด, ส่วนใหญ่), ใช้บล็อกมากกว่าเมื่อมันโตขึ้น

หากคุณเพิ่มไฟล์จำนวนมากไดเรกทอรีนั้นก็จะโตขึ้น แต่ถ้าคุณลบมันในภายหลังในหลาย ๆ ระบบไฟล์ไดเรกทอรีจะไม่ลดขนาดลง

ดังนั้นหากหนึ่งในไดเรกทอรีในทรีดั้งเดิมของคุณมีไฟล์จำนวนมากในบางจุดซึ่งถูกลบในภายหลังสำเนาของไดเรกทอรีนั้นจะ "เล็กลง" เนื่องจากจะใช้บล็อกจำนวนมากเท่าที่จำเป็นสำหรับจำนวนไฟล์ปัจจุบันเท่านั้น

ในรายการในการอัปเดตของคุณมี 3 ไดเรกทอรีที่คุณไม่ได้อยู่ในรายการ เปรียบเทียบขนาดของเหล่านั้น (หรือทายาทของเหล่านั้น) ในls -alผลลัพธ์ของคุณ

ในการค้นหาว่าข้อแตกต่างอยู่ที่ใดคุณสามารถลองls -alrบนทั้งสองไดเรกทอรีเปลี่ยนเส้นทางไปยังไฟล์จากนั้นหนึ่งdiffในสองเอาต์พุต


1
จับได้ดีสำหรับความเป็นไปได้อื่น! อย่างไรก็ตามในกรณีของ OPs cp -a src_dir another_destination/นั้นไม่น่าเป็นไปได้ซึ่งanother_destionationจะถูกสร้างขึ้นใหม่และปรับให้เหมาะสมในขณะที่src_dir(ซึ่งอาจมีไดเรกทอรีที่ใหญ่กว่าจากการสร้าง / การเพิ่มที่ผ่านมา) อาจมีขนาดใหญ่กว่าที่ต้องการ อย่างไรก็ตามผลลัพธ์แสดงว่าsrc_dirมีขนาดเล็กกว่าจริง ๆ ( 1112 < 1168)
Matija Nalis

@MatijaNalis เฉพาะตัวอย่างแรกหลังจาก "อัปเดต" แสดงให้เห็นว่า (1112 <1168) ... ตัวอย่างด้านล่างที่มีตัวเลขย้อนกลับและตัวอย่างแรกยังแสดงแหล่งที่ใหญ่กว่า (3782288 กับ 3502320) เป็นไปได้ที่การพิมพ์ผิดโดย OP?
TripeHound

> In the listings in your update, there are 3 directories you haven't listed. จริงๆแล้วมันคือไฟล์ไม่ใช่ไดเรกทอรี > if one of the directories in your original tree had many files at some point, which were later deletedดูชื่อไฟล์ ฉันคัดลอกไดเรกทอรีต้นทางจากเซิร์ฟเวอร์ระยะไกลด้วยคำสั่ง rsync และไม่ได้ลบสิ่งใดออกจากมัน
Hirurg103

1
@ Hirurg103 .รายการแสดง 5 ลิงก์ในไอโหนด หนึ่งคือการเชื่อมโยงจากไดเรกทอรีหลักไปยังหนึ่งนี้ .อีกประการหนึ่งคือ มีลิงก์อีก 3 ลิงก์ซึ่งควรเป็น..ลิงก์จากไดเรกทอรีย่อย ถ้าฉันไม่ได้ทำอะไรแปลก ๆ ต้องมีไดเรกทอรีย่อย 3 รายการในนั้น คุณกำลังบอกว่ารายชื่อเหล่านั้นเป็นผลเต็มรูปแบบ?
jcaron
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.