bash:/bin / ls: слишком длинный список аргументов
мне нужно сделать список большого количества файлов (40 000 файлов), как показано ниже:
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
3 ответов
вы должны быть в состоянии заменить ls ERR*_1_*.fastq
с find . -name "ERR*_1_*.fastq"
.
Таким образом, вы можете избежать расширения подстановочного знака в огромный список аргументов.
(том find
выход будет включать в себя ведущих "./", например,./ERR001268_1_100.fastq
. Если
это нежелательно, вы можете избавиться от него с другой sed
команда позже в
трубопровод.)
Если все файлы уже существуют в вашем каталоге, модуль "glob" python может иметь более высокий предел, чем командная строка 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
Это решение будет сортировать файлы в алфавитном порядке, а не численно. Для этого вы можете добавить некоторую key=lambda magic в метод sort ():
trimmedfiles.sort(key=lambda f: int(f.split("_")[2]))