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

for shell in $(sed '1d' /etc/shells); do # or use your own list of shells
    echo "$shell -"
    time $shell /path/to/script
done
3
10.07.2016, 01:38
4 ответа

Я решил проблему, позвольте мне поделиться с вами. Я переименовываю 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

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

1
27.01.2020, 21:09
  1. Не анализируйте вывод ls . Просто скажите foreach f (*) . Кроме того,
  2. Вы всегда должны указывать ссылки на переменные оболочки (например, "$ f" ), если у вас нет веской причины не делать этого, и вы конечно, ты знаешь, что делаешь.
6
27.01.2020, 21:09

Очевидно, у вас много файлов. Рассмотрите возможность использования 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
1
27.01.2020, 21:09

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

Если я правильно понимаю, у вас более 14 миллионов файлов. Нет никакого способа, чтобы ЛЮБАЯ оболочка могла иметь более 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 ОДИН РАЗ для каждого файла, поэтому это займет очень много времени. Вы могли бы немного ускорить его (не намного, не с 14 + M файлами для обработки), используя find ... -print0 с xargs -0 -P ... или GNU parallel -0 ... вместо find ... -exec


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

Это, конечно, потребует определенных навыков программирования на python .

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

3
27.01.2020, 21:09

Теги

Похожие вопросы