find + xargs | Argument list too long 解決方法

あるディレクトリの中身を削除しようと

以下のコマンドを実行した際に問題が発生しました。

 $ rm ./*
-bash: /usr/bin/rm: Argument list too long

本記事では、Argument list too longの解決方法を紹介します。

原因

コマンドに渡す引数が非常に多い場合に発生するエラーメッセージです。

rmコマンドに限らず、他のコマンドでも引数が非常に多い場合、発生します。

今回の場合、あまりにも削除しようとしているディレクトリの中身が膨大であった為、発生しました。

では、一つ、一つ削除するしかないのか。そんなことはありません。

次に解決方法を紹介します。

解決方法

xargsコマンド

引数が大きすぎた場合に大活躍するコマンドです。

逆にこの時ぐらいしか私はxargsコマンドを使いません。

xargsコマンドは、引数が多すぎた場合でも処理できます。

例として、あるディレクトリの中身を全て削除したい場合

$ echo ./* | xargs rm

echoコマンドで削除したいファイルを表示、パイプでxargsコマンドに値を渡します。

xargsコマンドの引数にrmコマンドがあることで、渡されたファイルを削除しています。

findコマンド

指定したディレクトリ以下から検索条件に一致するファイルやディレクトリを検索するコマンドです。

例として、あるディレクトリの中身を全て削除したい場合

$ find ./ -name "*" -exec rm {} \;

./は、ディレクトリの場所を指定します。自分なりに変えましょう。-nameで削除したいファイル名を検索し、-execで一致したファイルに対してコマンドを実行しています。

findコマンド+xargsコマンド

以下のようにしてあるディレクトリの中身を削除することも可能です。

 $ find ./ -name "*" | xargs rm

findコマンドで削除したいファイルを指定し、パイプで値を渡します。渡した値をxargsコマンドで削除しています。

引数に2つ以上用いるcpコマンド、mvコマンドをxargsコマンドで用いる場合、以下のように記述します。

$ find ./ -name "*" | xargs -I {} mv {} ./sample

例では、findコマンドで移動したいファイルを指定し、パイプで値を渡します。渡した値は、一旦、{}に入れてmvコマンドの引数に入れます。

そして、sampleディレクトリに移動しています。

まとめ

Argument list too longと言われたら、findコマンド、xargsコマンドを使いましょう。