/ bin / ls: слишком длинный список аргументов

Я человек биологии и запускаю программу под названием autodock. У меня есть файлы из библиотеки ZINC в формате .mol2. По требованию мне нужно разбить эти файлы с помощью команды csplit и я получил весь контент в моем каталоге. Родительский файл был разбит на очень маленькие файлы. Каждое имя файла выглядит следующим образом: ZINC14382748.mol2 . Теперь я должен изменить все эти файлы в формате pdbqt, и я должен использовать следующий скрипт:

 #!/bin/csh # # $Id: ex02.csh,v 1.5 2007/07/19 21:52:59 rhuey Exp $ # # use the 'prepare_ligands.py' python script to create pdbq files cd $VSTROOT/VirtualScreening/Ligands foreach f (`ls *`) echo $f pythonsh ../../prepare_ligand4.py -l $f -d ../etc/ligand_dict.py end 

Когда я использую его, он говорит:

 /bin/ls: Argument list too long 

Короче говоря, после успешного завершения он дублирует указанное количество файлов в другом формате. Итак, есть ли разумное решение для решения этой проблемы?

  • В чем разница между «и»?
  • Получение истинного абсолютного пути сценария в / bin / sh
  • Попытка создать cron для Rsync, затем tar папку
  • Оценка выражения и округление до трех десятичных знаков
  • Как правильно запустить программу и сделать возможным перенаправить свой текущий выход (stdout и stderr) на более поздний этап?
  • Как создать столько переменных, сколько необходимо из сценария оболочки (bash)?
  • Как запустить скрипт с другого пути и узнать путь к скрипту?
  • Начальная последовательность движения - модификация скрипта оболочки
  • 4 Solutions collect form web for “/ bin / ls: слишком длинный список аргументов”

    1. Не разбирайте вывод ls . Просто скажите foreach f (*) . Также,
    2. Вы всегда должны указывать ссылки на переменные оболочки (например, "$f" ), если у вас нет веских оснований, и вы уверены, что знаете, что делаете.

    Источником проблемы является то, что у вас слишком много мелких файлов.

    Если я правильно его читаю, у вас более 14 миллионов файлов. Нет никакой возможности, чтобы ANY-оболочка имела возможность иметь более 14 миллионов имен файлов в командной строке. Помимо этого. ваши имена файлов, по-видимому, составляют около 18 символов, так что это примерно 18 * 14M или около 252 мегабайт, просто чтобы сохранить имена файлов.

    Например, bash имеет предел 128 КБ. когда-либо так немного меньше, чем 252 МБ. Я не знаю, какой лимит csh имеет, потому что я его не использую. Это вряд ли будет больше, чем ограничение длины командной строки bash. Это, конечно, не будет 252 МБ или больше.

    Однако все не потеряно, вы можете использовать find ... -exec .

     find . -maxdepth 1 -type f -name '*.mol2' \ -exec pythonsh ../../prepare_ligand4.py -l {} -d ../etc/ligand_dict.py \; 

    Это запустит prepare_ligand4.py ONCE для каждого файла, поэтому потребуется очень много времени. Возможно, вы сможете немного ускорить его (не много, а не с 14 + M файлами для обработки), используя find ... -print0 с xargs -0 -P ... или GNU parallel -0 ... вместо find ... -exec


    Лучшим решением было бы загрузить исходный код для prepare_ligand4.py и изменить его, чтобы вы могли предоставить ему один большой файл (например, исходный файл до его csplit ), и он будет обрабатывать каждый блок по отдельности. Это будет намного быстрее и легче работать. Вероятно, у вас, вероятно, будет более 14M выходных файлов (если предположить, что объединенный выходной файл будет бесполезен … если вам не повезло!), Но это лучше, чем 14M входных файлов и 14M выходных файлов.

    Разумеется, это потребует некоторого навыка программирования python .

    Возможно, кто-то уже столкнулся с той же проблемой и написал собственную расширенную версию prepare_ligand4.py . Это стоит потратить некоторое время на поиск, или, может быть, попробовать форум Autodock или связаться с автором Autodock.

    У вас, очевидно, много файлов. Рассмотрим использование GNU Parallel http://www.gnu.org/software/parallel/ . «Ls -U» не сортирует файлы, а затем быстрее.

     cd $VSTROOT/VirtualScreening/Ligands ls -U ZINC* | parallel echo {} \; pythonsh ../../prepare_ligand4.py -l {} -d ../etc/ligand_dict.py 

    Я не понимаю, почему вы это повторяете. Разбираете ли вы его на новый скрипт? Я предполагаю, что «prepare_ligand4.py» – это сценарий для преобразования, и тогда это должно выполнять задание (параллельно):

     cd $VSTROOT/VirtualScreening/Ligands ls -U ZINC* | parallel pythonsh ../../prepare_ligand4.py -l {} -d ../etc/ligand_dict.py 

    Я решил проблему, позвольте мне поделиться с вами. Я переименую bash.csh в bash.sh, Затем я меняю свой скрипт, чтобы запустить его в bash. Вот мой новый скрипт, который поможет в будущем по той же проблеме.

     #!/bin/bash cd $VSTROOT/VirtualScreening/Ligands/ for f in ZINC*.mol2 do echo "$f" pythonsh ../../prepare_ligand4.py -l "$f" -d ../etc/ligand_dict.py done 

    Для новичка, подобного мне, здесь ZINC является частью имени, присутствующего во всех именах лигандов, поэтому должен храниться в соответствии с вашим именем лиганда. Спасибо за ваше время и мой друг, который помог мне страстно.

    Linux и Unix - лучшая ОС в мире.