मुझे 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शेल ग्लोब के समान फ़ाइलों को सॉर्ट नहीं करता है।