परिसर
आपको उस त्रुटि में उस विशिष्ट नाम प्रारूप [ 1 , 2 ] के साथ केवल 15k फ़ाइलों के लिए नहीं उठाना चाहिए ।
यदि आप उस विस्तार को किसी अन्य निर्देशिका से चला रहे हैं और आपको प्रत्येक फ़ाइल में पथ जोड़ना है, तो आपकी कमांड का आकार बड़ा होगा, और निश्चित रूप से यह हो सकता है।
समाधान उस निर्देशिका से कमांड चलाते हैं।
(cd That/Directory ; cat file_{1..2000}.pdb >> file_all.pdb )
सर्वश्रेष्ठ समाधान यदि इसके बजाय मैंने खराब अनुमान लगाया है और आप इसे उस निर्देशिका से चलाते हैं जिसमें फाइलें हैं ...
IMHO सबसे अच्छा समाधान स्टीफन चेज़ेलस हैं :
seq -f 'file_%.17g.pdb' 15000 | xargs cat > file_all.pdb
प्रिंटफ या सीक के साथ; प्री-कैशेड के अंदर केवल उनकी संख्या के साथ 15k फाइलों पर परीक्षण किया गया है यह और भी तेज है (वर्तमान में और ओपी एक को छोड़कर उसी निर्देशिका से जिसमें फाइलें हैं)।
कुछ शब्द और
आपको अपनी शेल कमांड लाइनों को और अधिक लंबा करने में सक्षम होना चाहिए।
आपकी कमांड लाइन 213914 वर्ण लंबी है और इसमें 15003 शब्द हैं
cat file_{1..15000}.pdb " > file_all.pdb" | wc
... यहां तक कि प्रत्येक शब्द के लिए 8 बाइट्स जोड़ने पर 333 938 बाइट्स (0.3M) 2097142 (2.1M) से नीचे ARG_MAX
कर्नेल पर 3.13.0 या थोड़ा छोटे 2088232 द्वारा रिपोर्ट की गई "कमांड की अधिकतम लंबाई" के रूप में रिपोर्ट किया गया है। का उपयोग करें " द्वाराxargs --show-limits
के उत्पादन के लिए अपने सिस्टम पर एक नजर डालें
getconf ARG_MAX
xargs --show-limits
आलस्य निर्देशित समाधान
इस तरह के मामलों में मैं ब्लॉक के साथ भी काम करना पसंद करता हूं क्योंकि आमतौर पर एक समय कुशल समाधान निकलता है।
तर्क (यदि कोई है) तो मैं 1 ... 1000 1001..2000 इत्यादि लिखने के लिए बहुत आलसी
हूं । इसलिए मैं एक स्क्रिप्ट को मेरे लिए करने के लिए कहता हूं।
आउटपुट की जाँच करने के बाद ही मैं इसे स्क्रिप्ट में रीडायरेक्ट करता हूँ।
... लेकिन आलस्य मन की एक अवस्था है ।
चूंकि मुझे एलर्जी है xargs
(मुझे वास्तव में xargs
यहां इस्तेमाल करना चाहिए ) और मैं यह नहीं जांचना चाहता कि इसका उपयोग कैसे करना है, मैं समय-समय पर पहिया को फिर से मजबूत करने के लिए समाप्त करता हूं जैसा कि नीचे दिए गए उदाहरणों में है (टीएल; ड्र)।
ध्यान दें कि चूंकि फ़ाइल नाम नियंत्रित हैं (कोई रिक्त स्थान, newlines ...) आप नीचे दी गई स्क्रिप्ट जैसी किसी चीज़ के साथ आसानी से जा सकते हैं।
tl; डॉ
संस्करण 1: 1 फ़ाइल नंबर, अंतिम, ब्लॉक आकार, आउटपुट फ़ाइल के वैकल्पिक पैरामीटर के रूप में पास करें
#!/bin/bash
StartN=${1:-1} # First file number
EndN=${2:-15000} # Last file number
BlockN=${3:-100} # files in a Block
OutFile=${4:-"all.pdb"} # Output file name
CurrentStart=$StartN
for i in $(seq $StartN $BlockN $EndN)
do
CurrentEnd=$i ;
cat $(seq -f file_%.17g.pdb $CurrentStart $CurrentEnd) >> $OutFile;
CurrentStart=$(( CurrentEnd + 1 ))
done
# Here you may need to do a last iteration for the part cut from seq
[[ $EndN -ge $CurrentStart ]] &&
cat $(seq -f file_%.17g.pdb $CurrentStart $EndN) >> $OutFile;
संस्करण 2
विस्तार के लिए बैश कॉलिंग (मेरे परीक्षणों में थोड़ा धीमा ~ 20%)।
#!/bin/bash
StartN=${1:-1} # First file number
EndN=${2:-15000} # Last file number
BlockN=${3:-100} # files in a Block
OutFile=${4:-"all.pdb"} # Output file name
CurrentStart=$StartN
for i in $(seq $StartN $BlockN $EndN)
do
CurrentEnd=$i ;
echo cat file_{$CurrentStart..$CurrentEnd}.pdb | /bin/bash >> $OutFile;
CurrentStart=$(( CurrentEnd + 1 ))
done
# Here you may need to do a last iteration for the part cut from seq
[[ $EndN -ge $CurrentStart ]] &&
echo cat file_{$CurrentStart..$EndN}.pdb | /bin/bash >> $OutFile;
बेशक आप आगे जा सकते हैं और पूरी तरह से seq
[ 3 ] से छुटकारा पा सकते हैं (कोर्यूटिल्स से) और सीधे बैश में चर के साथ काम करते हैं, या अजगर का उपयोग करते हैं, या एसी प्रोग्राम को करने के लिए [ 4 ] ...