サーバー構築

/bin/rm: Argument list too longの対処方法

/bin/rm: Argument list too longの対処方法
目次
  1. /bin/rm: Argument list too long
  2. 大量のファイルを消す方法!
  3. 【おまけ】ファイルを数える方法!

サーバー上にある大量のファイルを削除しようとしたらエラーで削除が出来ませんでした。

2026年11月時点の補足:Debian 13 で上限を確かめた結果

「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 でした・・・。