/bin/ls: パラメーターのリストが長すぎます。

/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

つまり、正常に完了すると、上記のファイル数を別の形式にコピーします。それでは、この問題を解決する合理的な方法はありませんか?

答え1

  1. 出力を解析しないでくださいls  言うforeach f (*)。返品、
  2. "$f"妥当な理由がなく、実行している操作がわからない限り、常にシェル変数参照(例:)を引用する必要があります。

答え2

問題の根本的な原因は、小さなファイルが多すぎるということです。

私が勘違いしていない場合は14以上です。百万文書。どのシェルもコマンドラインに1,400万を超えるファイル名を持つことはできません。しかも。ファイル名の長さは約18文字なので、ファイル名を保存するのに約18 * 14Mまたは約252 MBかかります。

bashたとえば、128KBの制限があります。 252MBより少し小さいです。csh使用していないため、どのような制限があるのか​​わかりません。 bashのコマンドラインの長さ制限よりも大きくはありません。確かに252MB以上ではないでしょう。

すべてが失われたわけではありませんが、find ... -exec引き続き使用できます。

find . -maxdepth 1 -type f -name '*.mol2' \
  -exec pythonsh ../../prepare_ligand4.py -l {} -d ../etc/ligand_dict.py \;

prepare_ligand4.pyこれは各ファイルに対して一度実行されるため、以下が必要です。非常に長期。代わりにfind ... -print0withxargs -0 -P ...またはGNUを使用してparallel -0 ...find ... -exec


より良い解決策は、ソースコードをダウンロードしてそれを変更して大きなファイル(-ing前の元のファイルprepare_ligand4.pyなど)を提供できるようにし、各チャンクを個別に処理することです。csplitこれは〜になりますたくさんより高速で簡単に使用できます。それでも14Mを超える出力ファイルがあるかもしれませんが(結合された出力ファイルが役に立たないと仮定すると...そうでなければ幸運です!)14M入力ファイルと14M出力ファイルを持つよりも優れています。

もちろん、これにはいくつかのpythonプログラミング技術が必要です。

おそらく、誰かがすでに同じ問題に直面して、独自の拡張バージョンを作成している可能性がありますprepare_ligand4.py。検索に時間を費やすか試してみる価値があります。オートドッグフォーラムAutodockの作成者に連絡してください。

答え3

明らかにファイルがたくさんあります。 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

答え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

私のような初心者の場合、ここでZINCはすべてのリガンド名に存在する名前の一部であるため、リガンド名に従って保存する必要があります。私を助けてくれた情熱と友達に感謝します。

関連情報