/ 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 

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

  • Grep / awk для нескольких файлов для одного вывода
  • Позиция курсора в vi при открытии файла
  • Извлечение почтовых адресов
  • Cronjob не выполняет сценарий оболочки, но когда я выполняю его автономно, он работает. Зачем?
  • Вызов java из Bash: «Невозможно выполнить двоичный файл»
  • Apt-get не работает в bash-скрипте?
  • Как эффективно использовать сценарии 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 является частью имени, присутствующего во всех именах лигандов, поэтому должен храниться в соответствии с вашим именем лиганда. Спасибо за ваше время и мой друг, который помог мне страстно.

    Interesting Posts

    Японский ввод с немецкой аппаратной раскладкой клавиатуры на Ubuntu

    Ли Linux прекращает обработку, связанную с графическим интерфейсом, когда мы удаляем экран рабочего стола из подключения из шкафа (процессорный блок)?

    Два массива имеют немного другой размер массива с одинаковыми размерами дисков / разделов, почему?

    арифметическая синтаксическая ошибка в сравнении строк

    SSH known_hosts игнорируется на одной машине

    sed эквивалентный код для AIX

    Удаление процесса в фоновом режиме

    Как отключить символическую ссылку CentOS?

    Виртуализировать Windows в Fedora и позволить Windows видеть реальное оборудование

    mount с cifs не удался, но назначение по-прежнему доступно с помощью sftp

    Растровые изображения блока e2fsck

    Может ли возникающая проблема увеличить размер виртуальной памяти в процессе?

    Когда можно отключить внешний жесткий диск?

    wrapper script: fork: retry: нет дочерних процессов

    Использовать функцию bash в конвейерной команде

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