मुझे 20GB से अधिक की कुल 10k + फाइलें मिली हैं जिन्हें मुझे एक फाइल में बदलना है।
से भी तेज रास्ता है
cat input_file* >> out
?
पसंदीदा तरीका बैश कमांड होगा, पाइथन स्वीकार्य है, भले ही वह कितना भी धीमा क्यों न हो।
मुझे 20GB से अधिक की कुल 10k + फाइलें मिली हैं जिन्हें मुझे एक फाइल में बदलना है।
से भी तेज रास्ता है
cat input_file* >> out
?
पसंदीदा तरीका बैश कमांड होगा, पाइथन स्वीकार्य है, भले ही वह कितना भी धीमा क्यों न हो।
जवाबों:
नहींं, बिल्ली निश्चित रूप से ऐसा करने का सबसे अच्छा तरीका है। जब इस उद्देश्य के लिए सी में पहले से ही एक कार्यक्रम लिखा गया है तो अजगर का उपयोग क्यों करें? हालाँकि, यदि आप xargs
कमांड लाइन की लंबाई अधिक होने की स्थिति में उपयोग करने पर विचार करना चाहते हैं ARG_MAX
और आपको एक से अधिक की आवश्यकता है cat
। GNU टूल का उपयोग करना, यह आपके पहले से ही के बराबर है:
find . -maxdepth 1 -type f -name 'input_file*' -print0 |
sort -z |
xargs -0 cat -- >>out
find
माध्यम से पाइप किया जाता है sort
। इसके बिना, फाइलों को एक अनियंत्रित क्रम में सूचीबद्ध किया जाएगा (फाइल सिस्टम द्वारा परिभाषित, जो फ़ाइल निर्माण आदेश हो सकता है)।
bash
ग्लोब से अलग तरह का व्यवहार हो सकता है । अन्यथा मैं किसी भी मामले हैं, जहां नहीं दिख रहा है xargs
या cat
अपेक्षा के अनुरूप व्यवहार नहीं होता।
xargs
कॉल करेगा cat
।
पहले आउटपुट फ़ाइल के लिए स्थान आवंटित करने से समग्र गति में सुधार हो सकता है क्योंकि सिस्टम को हर लेखन के लिए आवंटन को अपडेट नहीं करना होगा।
उदाहरण के लिए, यदि लिनक्स पर:
size=$({ find . -maxdepth 1 -type f -name 'input_file*' -printf '%s+'; echo 0;} | bc)
fallocate -l "$size" out &&
find . -maxdepth 1 -type f -name 'input_file*' -print0 |
sort -z | xargs -r0 cat 1<> out
एक और लाभ यह है कि यदि पर्याप्त खाली स्थान नहीं है, तो प्रतिलिपि का प्रयास नहीं किया जाएगा।
यदि पर btrfs
, आप copy --reflink=always
पहली फ़ाइल (जिसका अर्थ है कि कोई डेटा कॉपी नहीं है और इसलिए यह लगभग तात्कालिक होगा), और बाकी को जोड़ दें। यदि 10000 फाइलें हैं, तो संभवत: तब तक कोई फर्क नहीं पड़ेगा, जब तक कि पहली फाइल बहुत बड़ी न हो।
सभी फ़ाइलों ( BTRFS_IOC_CLONE_RANGE
ioctl
) को री-कॉपी करने के लिए सामान्य करने के लिए एक एपीआई है , लेकिन मुझे उस एपीआई को उजागर करने में कोई उपयोगिता नहीं मिल रही है, इसलिए आपको इसे सी ( python
या अन्य भाषाओं में करना होगा, बशर्ते कि वे मनमाने ढंग से कॉल कर सकें ioctl
) ।
यदि स्रोत फ़ाइलें विरल हैं या NUL वर्णों के बड़े अनुक्रम हैं, तो आप (GNU सिस्टम पर) के साथ विरल आउटपुट फ़ाइल (समय और डिस्क स्थान की बचत) बना सकते हैं:
find . -maxdepth 1 -type f -name 'input_file*' -print0 |
sort -z | xargs -r0 cat | cp --sparse=always /dev/stdin out
>
और न ही होना चाहिए >>
, लेकिन 1<>
जैसा कि मैंने फ़ाइल में लिखने के लिए कहा था ।
<>
मानक बॉर्न / POSIX रीड + राइट रीडायरेक्शन ऑपरेटर है। विवरण के लिए अपना शेल मैनुअल या POSIX कल्पना देखें। डिफ़ॉल्ट fd
है 0
के लिए <>
ऑपरेटर ( <>
के लिए कम है 0<>
, की तरह <
के लिए कम है 0<
और >
के लिए कम 1>
है ताकि आप की जरूरत है,) 1
स्पष्ट रूप से रीडायरेक्ट stdout के लिए। यहां, यह इतना नहीं है कि हमें पढ़ने + लिखने ( O_RDWR
) की आवश्यकता है, लेकिन हम O_TRUNC
(जैसा >
) नहीं चाहते हैं कि जो हमने अभी आवंटित किया है, उसे निपटा देगा।
dd
पढ़ने के साथ या इसके माध्यम से आगे की तलाश कर सकते हैं ।
fallocate
होंगे जहां अतिरिक्त के ओवरहेड को नकार दिया जाएगा find
, भले ही यह दूसरे समय के दौर में तेजी से हो। btrfs
हालांकि कुछ दिलचस्प संभावनाएं खुलती हैं।
find
शेल ग्लोब के समान फ़ाइलों को सॉर्ट नहीं करता है।