एक निर्देशिका को 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झंडा जोड़ा गया है :

-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कमांड के साथ अलग-अलग आकार मिलते हैं ?

अपडेट करें

जब मैं अलग-अलग निर्देशिकाओं को 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
दिलचस्प सवाल। क्या स्रोत और गंतव्य अलग-अलग ड्राइव / I वाइन्डर हैं यदि यह फाइल सिस्टम के ब्लॉक आकार में आता है।
davidgo

Hi @davidgo, स्रोत और गंतव्य एक ही ड्राइव पर अलग-अलग निर्देशिकाएं हैं। मैंने ls -laपरिणामों के साथ प्रश्न को अद्यतन किया । UPDATE
Hirurg103

2
क्या फाइलसिस्टम? यह हो सकता है कि निर्देशिकाएं स्वयं अधिक बड़ी हों (अधिक स्थान लें) जितना उन्हें होना चाहिए। इस प्रश्न की तुलना करें । द्वारा बनाई गई नई निर्देशिकाएं cpउतनी ही बड़ी हैं जितनी उन्हें होना चाहिए।
कामिल मैकियोरोस्की

ls -lsयह देखने के लिए उपयोग करें कि फाइलें कितनी डिस्क स्थान का उपयोग कर रही हैं।
Barmar

1
पुनरावर्ती 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 बाइट्स पर कब्जा कर लेगी (मेरे विशेष उदाहरण में; यह इस्तेमाल की गई फाइल सिस्टम, क्लस्टर आकार आदि के आधार पर भिन्न होगी)।

इसके अलावा, कुछ फाइलसिस्टम तथाकथित विरल फाइलों का समर्थन करते हैं, जो ब्लॉक के लिए किसी भी डिस्क स्थान का उपयोग नहीं करते हैं जो सभी शून्य हैं। उदाहरण के लिए:

% 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 -sbइसके बजाय उपयोग करेंगे du -s


1
न केवल विरल फाइलें बल्कि संपीड़ित फाइलें और इनलाइन फाइलें / निवासी फाइलें भी डिस्क का आकार फ़ाइल के आकार से छोटे होने का कारण
बनती हैं

1
और btrfs / zfs पर अजीब परिणाम।
वैल का कहना है कि मोनिका

2
@val: BTRFS संपीड़न duआउटपुट को प्रभावित नहीं करता है: जो संकुचित फ़ाइलों को उन प्रोग्रामों के लिए विरल दिखाएगा, जो लंबाई के सामान्य एल्गोरिथ्म का उपयोग करते हैं! = ब्लॉक। btrfs.wiki.kernel.org/index.php/…
पीटर कॉर्ड्स

@PeterCordes लेकिन CoW सामान डु आउटपुट को बहुत ही संवेदनहीन बनाता है।
वैल कहते हैं

डुप्लिकेट फ़ाइलों के बारे में क्या? क्या आधुनिक प्रणाली डुप्लिकेट सामग्री को पहचान कर स्थान नहीं बचा सकती हैं?
21:39 पर FreeSoftwareServers

12

यह निर्देशिका "फ़ाइलों" के आकार के कारण हो सकता है।

अधिकांश फाइल सिस्टम में, डिस्क पर, एक निर्देशिका एक नियमित फ़ाइल की तरह होती है (केवल नाम और नोड संख्याओं की एक सूची के साथ, अधिकतर), अधिक ब्लॉक का उपयोग करते हुए यह बढ़ता है।

यदि आप कई फाइलें जोड़ते हैं, तो निर्देशिका खुद बढ़ती है। लेकिन यदि आप उन्हें बाद में हटाते हैं, तो कई फाइल सिस्टम में, निर्देशिका सिकुड़ नहीं जाएगी।

इसलिए यदि आपके मूल पेड़ में से किसी एक निर्देशिका में किसी बिंदु पर कई फाइलें थीं, जिन्हें बाद में हटा दिया गया था, तो उस निर्देशिका की प्रतिलिपि "छोटी" होगी, क्योंकि यह केवल कई ब्लॉकों का उपयोग करती है, क्योंकि इसे फ़ाइलों की वर्तमान संख्या की आवश्यकता होती है।

आपके अद्यतन में लिस्टिंग में, 3 निर्देशिकाएँ हैं जिन्हें आपने सूचीबद्ध नहीं किया है। अपने में उन (या उन के वंशज) के आकार की तुलना करेंls -al आउटपुट ।

यह पता लगाने के लिए कि अंतर कहां है, आप ls -alrदोनों निर्देशिकाओं पर, एक फ़ाइल पर पुनर्निर्देशित और फिर diffदो आउटपुट में से एक पर कोशिश कर सकते हैं ।


1
एक और संभावना के लिए अच्छी पकड़! हालांकि, ओपी के मामले में cp -a src_dir another_destination/यह संभव नहीं है, जैसा another_destionationकि नव निर्मित और इस तरह से अनुकूलित किया जाएगा, जबकि src_dir(जो पिछले निर्माण / परिवर्धन से कुछ बड़ी निर्देशिकाएं हो सकती थीं) वास्तव में जरूरत से ज्यादा बड़ी हो सकती हैं। हालांकि परिणाम बताते हैं कि src_dirवास्तव में छोटा है ( 1112 < 1168)।
मतिजा नलिस

@MatijaNalis "अपडेट" के बाद केवल पहला उदाहरण दिखाता है कि (1112 <1168) ... नीचे दिए गए उदाहरण में आंकड़े उलट हैं, और पहला उदाहरण स्रोत को बड़ा (3782288 बनाम 3502320) भी दिखाता है। संभवतः ओपी द्वारा एक टाइपो?
ट्रिपहाउंड

> 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 उपनिर्देशिकाएँ होनी चाहिए। क्या आप कह रहे हैं कि वे लिस्टिंग पूर्ण आउटपुट हैं?
12
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.