ウェブサイト検索

−bash: /bin/rm: 引数リストが長すぎます − 解決策


症状

このエラーメッセージは、長いファイルリストを削除、移動、またはコピーしようとしたときに表示されます。シェルを使用する際、コマンドは受け入れられる引数の数に制限があります。コマンドに供給される引数の数が許可された引数の数を超えると、エラーメッセージが表示されます:


-bash: /bin/rm: Argument list too long
getconf ARG_MAX 2097152

例 :


rm *
-bash: /bin/rm: Argument list too long

解決策

この問題にはいくつかの解決策があります。まず、保持したいファイルがディレクトリ内にない場合、最も良いかつ迅速な解決策は、単にディレクトリ全体を削除し、再作成することです。進む前に、そのディレクトリに保持したいファイルが含まれていないこと、およびこのディレクトリの権限と所有権に関してメモを取ることを確認してください。


cd ../
ls -d mydirectory
rm -fr mydirectory
mkdir mydirectory

もう一つの解決策は、forループを使ってファイルを一つずつ削除することです:


for i in *; do rm "$i"; done

または printf と xargs を使用することで、はるかに速く:


printf '%s\0' * | xargs -0 rm

または


time echo -n * | tr ' ' '\0' | xargs -0 rm

しかし、上記の解決策には独自の制限があります。適切な正規表現がない場合、保持したいファイルも削除される可能性があります。ここでは、*.txtファイルのみを削除する例を示します:


for i in *.txt; do rm "$i"; done

最後に提案されている解決策は、正規表現を使用してすべてのファイルを小さなバッチに分割することです。すべてのファイルの中で似たパターンを見つけ、それらを小さなグループに分けます。例えば、まずはaで始まり、拡張子がtxtのすべてのファイルを削除、コピー、または移動し、その後はbで始まるファイルを処理します。


rm a*.txt
rm b*.txt

forループを使用して、上記のすべての文字に対しても同じことができます。


for i in $( echo {a..z} ); do rm $i*.txt ; done

関連記事: