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

  • Считать количество вхождений регулярного выражения в круглых скобках
  • как мы можем использовать несколько переменных в одиночном для цикла в сценарии оболочки?
  • Как очистить или перезаписать ОЗУ и выключить компьютер по сценарию bash, который реагирует на сочетание клавиш?
  • Приведение процесса к файловому дескриптору в переменную
  • Кэш всех паролей паролей gpg сразу? Предотвратить необходимость ввода нескольких паролей в gpg?
  • Bash: слияние имени папки из переменной с именем файла
  • Добавление записей в массив внутри цикла
  • назначить вывод программы ac переменной оболочки: ошибка токена
  • Как изменить пользователя с аутентификацией внутри сценария оболочки
  • Лучший способ обмена именами файлов
  • Получение возвратов Nagios из скрипта через NRPE
  • Почему убийство процесса печатается в консоли
  • Interesting Posts

    Как печатать текст между первым вступлением пары строк?

    Проблема с поврежденными пакетами

    Как minicom «постоянно» переводит входящую новую строку (\ n) в CR + LF?

    Как создать постоянный псевдоним без ресурса .bashrc-подобного файла?

    Наличие nVidia OpenGL 32-битного драйвера на 64-битной системе Debian в многоархиве

    Проблемы с отрицательным каналом мониторинга запугивают!

    Что означает «синхронный» тип детали в dmidecode?

    Сценарий оболочки для захвата имени и размера файла в файле csv и добавления заголовка в этот файл

    Как проверить, пуст ли файл или имеет только пустые символы?

    Удаление процесса зомби из таблицы процессов

    Поддержка mutt – multiaccount

    i3wm: вызов программы через i3 в одном рабочем пространстве, вызов программы через терминал в другой

    Устранение привязки запущенного процесса к заданию

    Создайте нового пользователя без подсказки с chpasswd

    Проблемы с Grub и rEFIt в Fedora

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