−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