매개변수 목록이 너무 긴 경우 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

관련 정보