/bin/rm: Argument list too longの対処方法
サーバー上にある大量のファイルを削除しようとしたらエラーで削除が出来ませんでした。
「Argument list too long」は rm の不具合ではなく、1 回のコマンドに渡せる引数の長さの上限(ARG_MAX)を超えたときにカーネルが返すエラーです。Debian 13.7 の VPS(さくらのVPS・2GB プラン・3コア)で、ファイルを作らずに同じエラーを出して確かめました(2026年11月5日)。
$ getconf ARG_MAX
2097152
$ /bin/true $(seq 1 400000)
-bash: /bin/true: Argument list too long
$ time (seq 1 400000 | xargs /bin/true)
real 0m0.102s
$ seq 1 400000 | xargs | wc -l
21
40万個の引数は 1 回では渡せませんが、xargs は上限に収まるように 21 回に分けて実行し、0.1秒で終わりました。記事の find や xargs を使う方法が効くのはこのためです。
| 方法 | 引数の上限に当たるか | 向いている場面 |
|---|---|---|
| rm * | 当たる(ファイル名を全部 1 回で渡す) | 数千件まで |
| find . -type f -delete | 当たらない(find が 1 件ずつ消す) | 件数が多いとき。いちばん速い |
| find . -type f -print0 | xargs -0 rm | 当たらない(xargs が分けて渡す) | 名前に空白があるファイルも安全に消す |
| ls | xargs rm | 当たらない | 名前に空白や改行があると誤動作するので非推奨 |
| 項目 | この記事(2014年) | Debian 13(2026年11月時点) |
|---|---|---|
| ARG_MAX | 記載なし | 2,097,152バイト(2MB) |
| 40万個の引数を xargs で実行 | — | 21回に分けて 0.1秒 |
/bin/rm: Argument list too long
下記の方法は一般的でよく使いますよね。
$ rm *
-su: /bin/rm: Argument list too long
このディレクトリには、約35,000件のキャッシュファイルがありました。
ネットで調べて見ると、Linux はコマンド名からパラメータ(*指定などは展開後)までの文字数の上限があります。とのこと。
じゃ、この場合、
「cache_c21f969b5f03d33d43e04f8f136e7682_1797ae85613e40bab39c594aa68f12a2」
71文字 × 35,000 で 2,485,000文字 + α になるんですかね・・・。
今回、$ rm * でファイルを削除が出来なかったですが、削除する方法がありますのでご紹介します!
大量のファイルを消す方法!
特定のファイル名だけを前方一致で消す方法。
// 削除実行
$ find . -name "cache_*" -print | xargs rm
rm: cannot remove `./cache_e': Is a directory
rm: cannot remove `./cache_c': Is a directory
rm: cannot remove `./cache_d': Is a directory
rm: cannot remove `./cache_2': Is a directory
rm: cannot remove `./cache_f': Is a directory
ディレクトリが前方一致でヒットしても削除はされません。
心配の方は、$ find . -name "cache_*" -type f -print | xargs rm のようにファイル限定すると安心です。
すべてのファイルを削除する方法。
// 削除実行
$ find . -type f -print | xargs rm
削除後は特に出力はありません。
【おまけ】ファイルを数える方法!
削除する前にファイル数を知りたい方はこちら!ファイル数を調べる方法は、削除するコマンドを応用すれば簡単に数えること出来ます。
特定のファイル名だけを前方一致で数える方法。
// カウント
$ find . -name "cache_*" -type f -print | wc -l
0
この場合、オプションの -type f を付けてあげるのがポイントです。オプションを付けなかった場合は、ディレクトリも数に入るのでファイル限定にします。
すべてのファイルを数える方法。
// カウント
$ find . -type f -print | wc -l
0
ファイルをすべて消した後だったので、カウントは 0 でした・・・。