2011-08-11 74 views
6

我需要做大量的文件(40,000文件)的列表,像下面:的bash:/ 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

但是我能解決這個問題嗎? 任何其他方式可以通過perl/python來製作這樣的列表?

THX

回答

11

你應該能夠find . -name "ERR*_1_*.fastq"更換ls ERR*_1_*.fastq
通過這種方式,您可以避免將通配符擴展爲巨大的參數列表。

(該find輸出將包括領先的「./」,例如./ERR001268_1_100.fastq。如果 這是不可取的,你可以得到sed命令後在 管道擺脫它與其他。)

1

如果已經將文件都存在於你的目錄中,python的「glob」模塊可能比bash的命令行有更高的限制。

在命令行:

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

要做到整個事情在Python中,你可以嘗試這樣的事:

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

該解決方案將文件按字母順序進行排序,而不是數字。對於您可能希望將一些關鍵=拉姆達魔法添加到sort()方法:

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

你可能需要一個''\ n'.join (...)'圍繞glob調用。否則,這個答案讓我擺脫了類似的情況,+1 – quornian

0

查找可能會幫助你 - 而不是LS使用find . -name 'yourpatternhere' -print0 | xargs -0 youractionhere