2011-08-11 31 views
6

tôi cần phải thực hiện một danh sách của một số lượng lớn các tập tin (40.000 file) như dưới đây:bash:/bin/ls: Đối số danh sách quá dài

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 

lệnh của tôi là: ls ERR*_1_*.fastq |sed 's/\.fastq//g'|sort -n > masterlist Tuy nhiên lỗi là: bash: /bin/ls: Argument list too long

Tuy nhiên tôi có thể giải quyết vấn đề này không? Bất kỳ cách nào khác để làm cho danh sách như thế này bằng perl/python?

thx

Trả lời

11

Bạn sẽ có thể thay thế ls ERR*_1_*.fastq với find . -name "ERR*_1_*.fastq".
Bằng cách này, bạn có thể tránh việc mở rộng ký tự đại diện thành danh sách đối số lớn.

(The find đầu ra sẽ bao gồm một lãnh đạo "./", ví dụ như ./ERR001268_1_100.fastq. Nếu đó là mong muốn, bạn có thể thoát khỏi nó với một sed lệnh sau trong các đường ống .)

1

Nếu các tập tin đã tất cả tồn tại trong thư mục của bạn, mô-đun "glob" của python có thể có giới hạn cao hơn dòng lệnh của bash.

Từ dòng lệnh:

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

Để làm toàn bộ điều trong python, các bạn có thể thử một cái gì đó như thế này:

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

Giải pháp này sẽ sắp xếp các tập tin theo thứ tự abc, và không phải số lượng . Cho rằng bạn có thể muốn thêm một số key = lambda kỳ diệu để các loại() phương pháp:

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

Bạn có thể muốn một ' '\ n'.join (...) 'xung quanh cuộc gọi glob. Nếu không, câu trả lời này khiến tôi thoát khỏi tình huống tương tự, +1 – quornian

0

Find có thể giúp bạn - chứ không phải sau đó ls sử dụng find . -name 'yourpatternhere' -print0 | xargs -0 youractionhere

Các vấn đề liên quan