/ 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 

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

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 является частью имени, присутствующего во всех именах лигандов, поэтому должен храниться в соответствии с вашим именем лиганда. Спасибо за ваше время и мой друг, который помог мне страстно.

  • Вставка файла в другой файл с помощью sed
  • как я могу выполнить вычисление чисел из текстового файла в сценарии оболочки
  • Как умножить два столбца в файле на постоянное число
  • Команда find и rm не подчиняется исключающему списку
  • Как собрать имя файлов в каждом подкаталоге в текстовый файл в этом подкаталоге?
  • Уточнение в отношении поведения сценария оболочки вместе с трубкой
  • Эхо-вывод результатов в неустойчивом порядке в BASH
  • Как запустить скрипт для получения определенного содержимого файла
  • Создание сценария Bash, который будет выполнять программу, и если он выйдет без сбоев, снова запустит его
  • Выберите файл на основе количества строк и обработайте результат
  • печать цветного текста с использованием эха
  • Interesting Posts

    Создайте экземпляр (тип Windows) приложения в Linux

    Linux: инструмент командной строки для простого изменения реальной беспроводной сети, подключенной к сети?

    Ограничение доступа к веб-сайту на основе IP-адреса, когда .htaccess не разрешен

    Большое медиа-хранилище и ZFS или BTRFS

    Брандмауэр AIX принимает установленное соединение

    «найти» для нечувствительных к регистру слов?

    Можно ли использовать последующие серверы имен, определенные в файле /etc/resolv.conf, если предыдущие серверы имен не могут быть разрешены?

    Установка Qt Creator на Debian

    Есть ли способ отобразить все сценарии, вызываемые из другого скрипта?

    Handbrake на Debian не знает о x265, несмотря на установленные

    Как я могу сделать свою тему Zsh («fade») хорошо выглядеть в urxvt?

    Невозможно скопировать файлы из образа ISO с контурами: Ошибка ввода / вывода

    Фильтрация журнала на последней букве в строке

    Alt + Tab на Fluxbox

    Как получить (только) http-статус сайта в сценарии оболочки?

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