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

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

truncateこのコマンドを使用して、テスト用に多数の小さなファイルを作成したいと思います。少数のファイル(100個)でコマンドを実行してみたところ、成功しました。数値を 1000000 に変更するとエラーが発生します。

root:[~/data]# truncate -s 1k {1..100}
root:[~/data]# rm -rf *
root:[~/data]# truncate -s 1k {1..1000000}
-bash: /usr/bin/truncate: Argument list too long
root:[~/data]#

どうすれば解決できますか?うまくいくような気がしますが、うまくいくxargsことはできません。

答え1

あなたはできます

echo {1..1000000} | xargs truncate -s 1k

(これはコマンドラインの長さに関係なく、組み込みエコーを持つシェルで使用する必要があります。xargs入力はデフォルトで空白に分割されますが、ここでは重要ではありません。)

上記のコードは多くのメモリを使用できるため、seqmosvyの説明のように使用する方が良いかもしれません。

seq 1 1000000 | xargs truncate -s 1k

しかし、私は通常ループを使います(これは000000notで始まり1、すべての名前に前に0があります)。

for i in {000..999}; do
    touch "$i"{000..999}
done

1つのディレクトリに100万のファイルがあると速度が遅くなる可能性があるため、テストだけではない場合は、ファイルを次のサブディレクトリに分散することをお勧めします。

for i in {000..999}; do
    mkdir "$i"
    touch "$i"/{000..999}
done

これらのファイルが1つのコマンドラインに収まり、作成できず、何らかの問題を解決できない場合は、rm -f *これらのファイルを使用してファイルを削除できない可能性があります。ツリー全体を再帰的に削除する必要がありますfind -maxdepth 1 -type f -delete

答え2

ロジックを説明する@ilkkachuの素晴らしい答えにコメントを追加してください。注文する

truncate -s 1k {1..1000000}

truncate電話百万これは、ほとんどのシステムでは、システムコールの引数と環境変数の累積数とサイズのデフォルト制限をはるかに超えていますtruncate。だからargv[0]-s1kexecve()「パラメータリストが長すぎます」間違い。

代わりに提案された解決策は

seq 1 1000000 | xargs truncate -s 1k

システムコールの制限を避けるために、必要な数の引数(を除いて各呼び出しで繰り返し)を実行truncate(転送)するだけです。xargstruncate-s1kexecve()

関連情報