2011-08-11 8 views
6

मैं फ़ाइलों की एक बड़ी संख्या (40,000 फ़ाइलें) की एक सूची बनाने की जरूरत है:/bin/lsबैश: नीचे की तरह तर्क सूची बहुत लंबा

ERR001268_1_100.fastq ERR001268_2_156.fastq ERR001753_2_78.fastq 
ERR001268_1_101.fastq ERR001268_2_157.fastq ERR001753_2_79.fastq 
ERR001268_1_102.fastq ERR001268_2_158.fastq ERR001753_2_7.fastq 
ERR001268_1_103.fastq ERR001268_2_159.fastq ERR001753_2_80.fastq 

मेरे आदेश है: ls ERR*_1_*.fastq |sed 's/\.fastq//g'|sort -n > masterlist हालांकि त्रुटि है: bash: /bin/ls: Argument list too long

हालांकि क्या मैं इस समस्या को हल कर सकता हूं? पर्ल/पायथन द्वारा इस तरह की सूची बनाने का कोई और तरीका?

THX

उत्तर

11

आप find . -name "ERR*_1_*.fastq" साथ ls ERR*_1_*.fastq को बदलने के लिए सक्षम होना चाहिए।
इस तरह, आप वाइल्डकार्ड को एक विशाल तर्क सूची में विस्तार से बचने से बच सकते हैं।

(find उत्पादन शामिल होंगे एक अग्रणी "./", जैसे ./ERR001268_1_100.fastq। कि अवांछनीय है, तो आप इसके बारे में दूसरे के साथ sed आदेश बाद में पाइप लाइन में छुटकारा पाने के कर सकते हैं।)

1

पहले से ही फ़ाइलें हैं सभी आपकी निर्देशिका के भीतर मौजूद हैं, पायथन के "ग्लोब" मॉड्यूल में बैश की कमांड लाइन की तुलना में अधिक सीमा हो सकती है।

कमांड लाइन से:

import glob 
files = glob.glob("ERR_*_1_*.fastq") 
trimmedfiles = [x.replace(".fastq","") for x in files] 
trimmedfiles.sort() 
for f in trimmedfiles: 
    print f 

यह समाधान वर्णानुक्रम फ़ाइलें क्रमबद्ध नहीं संख्यानुसार, और:

python -c "import glob; print glob.glob('ERR_*_1_*.fastq')" 

अजगर में पूरी बात करने के लिए, आप कुछ इस तरह की कोशिश कर सकते । उसके लिए आपको प्रकार के कुछ प्रमुख = लैम्ब्डा जादू को जोड़ने के लिए चाहते हो सकता है() विधि:

trimmedfiles.sort(key=lambda f: int(f.split("_")[2])) 
+1

आप शायद चाहते हैं एक ' '\ n'.join (...) 'ग्लोब कॉल के आसपास। अन्यथा, इस जवाब ने मुझे एक समान स्थिति, +1 से बाहर कर दिया – quornian

0

पाते हैं कि आप मदद कर सकता है - तो बल्कि ls का उपयोग find . -name 'yourpatternhere' -print0 | xargs -0 youractionhere

संबंधित मुद्दे