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

  • Переименование файлов в зависимости от их родительского каталога
  • Сохранение подзаголовка в фоновом режиме
  • * .desktop или symlink работает (только для этого одного файла) - Linux Mint 17.2 Cinnamon
  • Как заменить определенный текст на соответствующий номер строки с помощью sed?
  • Проблема в разделении строки с помощью команды awk или cut
  • Shellscript для удаления определенных тегов в файле HTML
  • Создание дерева символических ссылок в существующих каталогах
  • Случайные аргументы (содержащие цветовые коды) из массива
  • Как lsof прикрепить к скрипту PID скрипта?
  • Поймать количество синтаксических ошибок в сценарии оболочки
  • ls дает мне разные заказы сортировки во время работы cron
  • Interesting Posts

    Таинственный файл, который я не могу удалить

    Изменить каталог с помощью -d в сценарии оболочки

    Что такое функции для создания разреженных файлов в Linux?

    Что такое команда Linux, в которой перечислены только USB-устройства хранения данных?

    Возможно ли, чтобы сценарий оболочки содержал команды tcsh и bash в одном скрипте?

    Установка OpenSuse Leap 42.1 – Установка зависает при запуске udev "

    Как этот псевдоним bash повторяет последнюю команду как sudo?

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

    Установка пользовательских пакетов в Linux

    Как настроить RTLinux на ноутбуке x64, чтобы вести себя в реальном времени?

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

    Изменение IP-адреса удаленного хоста без потери контроля (Linux)

    Что такое «решение о маршрутизации» в контексте iptables?

    Развернуть переменную в расширении скобки

    написать pc uptime в файле при завершении работы

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