2011-08-11 14 views
6

muszę zrobić listę dużej liczby plików (40000 plików) jak poniżej:bash:/bin/ls: lista argumentów za długa

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 

moje polecenia: ls ERR*_1_*.fastq |sed 's/\.fastq//g'|sort -n > masterlist jednak błąd jest: bash: /bin/ls: Argument list too long

Czy mogę jednak rozwiązać ten problem? Każdy inny sposób tworzenia listy przez perl/Pythona?

thx

Odpowiedz

11

Powinieneś być w stanie zastąpić ls ERR*_1_*.fastq z find . -name "ERR*_1_*.fastq".
W ten sposób można uniknąć rozszerzenia wieloznacznika na ogromną listę argumentów.

(Wyjście find obejmie wiodącą „./”, np ./ERR001268_1_100.fastq. Jeśli to niepożądane, można pozbyć się go z innego polecenia sed później w rurociągu.)

1

Jeśli już plików wszystkie istnieją w twoim katalogu, moduł python "glob" może mieć wyższy limit niż linia poleceń basha.

Z wiersza poleceń:

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

zrobić całość w Pythonie, z ewentualnego spróbować czegoś takiego:

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

Rozwiązanie to posortować pliki alfabetycznie, a nie numerycznie . Do tego warto dodać trochę magii lambda = klucz do sortowania() metoda:

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

Prawdopodobnie chcą ' '\ n'.join (...) "wokół połączenia globalnego. W przeciwnym razie ta odpowiedź wyciągnęła mnie z podobnej sytuacji, +1 – quornian

0

Wyszukiwanie może pomóc - a następnie ls używać find . -name 'yourpatternhere' -print0 | xargs -0 youractionhere

Powiązane problemy