前提
あなたは、のためにそのエラーに負担してはならないだけで、その特定の名前形式の15Kファイル[ 1、2 ]。
その展開を別のディレクトリから実行していて、各ファイルにパスを追加する必要がある場合、コマンドのサイズは大きくなり、もちろん発生する可能性があります。
解決策は、そのディレクトリからコマンドを実行します。
(cd That/Directory ; cat file_{1..2000}.pdb >> file_all.pdb )
最良の解決策代わりに私が悪いと推測し、あなたがファイルがあるディレクトリからそれを実行する場合...
私見最良の解決策はステファンシャゼラスのものです:
seq -f 'file_%.17g.pdb' 15000 | xargs cat > file_all.pdb
printfまたはseqを使用。事前にキャッシュされた数だけを含む15kファイルでテストされた場合は、さらに高速です(現在、ファイルが存在する同じディレクトリのOPファイルを除く)。
もっと言葉を
シェルコマンドラインにもっと長く渡すことができるはずです。
コマンドラインの長さは213914文字で、15003 語が含まれています
cat file_{1..15000}.pdb " > file_all.pdb" | wc
...各ワードに8バイトを追加してもARG_MAX
、カーネル3.13.0で報告された2097142(2.1M)または「実際に実行できるコマンドの最大長使用」によりますxargs --show-limits
システムの出力を見てみましょう
getconf ARG_MAX
xargs --show-limits
遅延ガイド付きソリューション
このような場合、通常は時間効率の良いソリューションが得られるため、ブロックを使用することを好みます。
ロジック(ある場合)は、私が1 ... 1000 1001..2000などを書くにはあまりにも面倒だからです。
ですから、私にスクリプトを依頼してください。
出力が正しいことを確認した後にのみ、スクリプトにリダイレクトします。
...しかし、怠azineは心の状態です。
私はアレルギーがあるのでxargs
(ここで実際に使用xargs
するべきでした)、使用方法を確認したくないので、次の例(tl; dr)のように時間通りにホイールの再発明を完了します。
ファイル名は制御されているため(スペース、改行なしなど)、以下のスクリプトのようなものを簡単に使用できることに注意してください。
tl; dr
バージョン1:オプションのパラメーターとして、最初のファイル番号、最後のファイル、ブロックサイズ、出力ファイルを渡す
#!/bin/bash
StartN=${1:-1} # First file number
EndN=${2:-15000} # Last file number
BlockN=${3:-100} # files in a Block
OutFile=${4:-"all.pdb"} # Output file name
CurrentStart=$StartN
for i in $(seq $StartN $BlockN $EndN)
do
CurrentEnd=$i ;
cat $(seq -f file_%.17g.pdb $CurrentStart $CurrentEnd) >> $OutFile;
CurrentStart=$(( CurrentEnd + 1 ))
done
# Here you may need to do a last iteration for the part cut from seq
[[ $EndN -ge $CurrentStart ]] &&
cat $(seq -f file_%.17g.pdb $CurrentStart $EndN) >> $OutFile;
バージョン2
拡張のためにbashを呼び出します(テストでは少し遅くなります〜20%)。
#!/bin/bash
StartN=${1:-1} # First file number
EndN=${2:-15000} # Last file number
BlockN=${3:-100} # files in a Block
OutFile=${4:-"all.pdb"} # Output file name
CurrentStart=$StartN
for i in $(seq $StartN $BlockN $EndN)
do
CurrentEnd=$i ;
echo cat file_{$CurrentStart..$CurrentEnd}.pdb | /bin/bash >> $OutFile;
CurrentStart=$(( CurrentEnd + 1 ))
done
# Here you may need to do a last iteration for the part cut from seq
[[ $EndN -ge $CurrentStart ]] &&
echo cat file_{$CurrentStart..$EndN}.pdb | /bin/bash >> $OutFile;
もちろん、前進してseq
[ 3 ](coreutilsから)を完全に取り除き、bashの変数を直接操作するか、Pythonを使用するか、acプログラムをコンパイルして[ 4 ] ...