パラメータリストが長すぎる場合のsedの処理方法

パラメータリストが長すぎる場合のsedの処理方法

次のコマンドを適用してみてください。

sudo sed -i "s/auth-user-pass/auth-user-pass pass.txt/g" *.ovpn

ただし、引き続き次のエラーが発生します。

sudo: unable to execute /bin/sed: Argument list too long

引っ越したいですかxargs

答え1

xargs変形用途find:

find . -maxdepth 1 -type f -name '*.ovpn' \
    -exec sed -i 's/auth-user-pass/auth-user-pass pass.txt/g' {} +

これにより、sed現在のディレクトリ内の指定されたパターンに一致する最大のファイル名の配置(通常のファイルのみ、一致するディレクトリ名なしなど)に対してコマンドが実行されます。また、潜在的に奇妙なファイル名(スペース、改行など)も処理します。

オプション-maxdepth/predicatesは標準ではありませんが、頻繁に実装されています。

答え2

はい、一緒に歩くのがxargs正しい方法です。

簡単な場合

echo *.ovpn | xargs sed -i 's/auth-user-pass/auth-user-pass pass.txt/g'

ただし、名前にスペースが含まれていないファイルでのみ機能します。安全な方法は

printf '%s\0' *.ovpn | xargs -0 sed ...

パイプライン全体を実行しない場合は、beforeまたはbeforeをroot指定してください。sudoxargssed

関連情報