xargs를 통해 파이프된 출력 찾기를 사용하여 파일 목록에서 여러 sed 명령을 실행하는 방법

xargs를 통해 파이프된 출력 찾기를 사용하여 파일 목록에서 여러 sed 명령을 실행하는 방법

내가 시도한 것은 다음과 같습니다.

find . -name *.sv | xargs sed -i -e '<command>' -e '<command>'

이것은 작동하지 않습니다. 각 파일에 대해 정확히 동일한 명령을 사용하면 여전히 작동합니다.

도움을 주셔서 감사합니다.

답변1

xargs한 번에 하나의 파일만 강제로 실행하려면 with를 사용하십시오. 또한 공백 등이 포함된 경로 이름이 올바르게 처리되도록 using에서 경로 이름을 전달하고 with를 사용하여 수신해야 합니다(및 이러한 비표준 옵션을 지원하는 경우). 또한 (디렉토리 등이 아닌) 일반 파일을 찾고 있음을 지정해야 할 수도 있으며 쉘 glob을 반드시 인용해야 합니다(또는 현재 디렉토리에서 일치하는 파일 이름으로 확장될 수 있습니다).sed-n 1xargsfind-print0xargs-0findxargs

find . -type f -name '*.sv' -print0 | xargs -0 -n 1 sed -i -e '<command>' -e '<command>'

또는 다음을 사용하십시오 find.

find . -type f -name '*.sv' -exec sed -i -e '<command>' -e '<command>' {} ';'

관련된:


를 사용하지 않지만 find실행 후 **사용할 수 있는 globbing 패턴을 사용하는 솔루션(하위 디렉터리까지 "재귀적" 일치):bashshopt -s globstar

shopt -s globstar dotglob nullglob
for pathname in ./**/*.sv; do
    if [[ -f "$pathname" ]] && [[ ! -h "$pathname" ]]; then
        sed -i -e '<command> -e '<command>' "$pathname"
    fi
done

이 루프는 파일 이름 접미사가 있는 모든 파일을 반복 하고 일치하는 각 이름을 테스트하여 명령을 적용하기 전에 일반 파일인지 확인합니다( 일반 파일에 대한 심볼릭 링크가 아닌지 확인 .sv하려면 개별적으로 테스트해야 합니다 ) . 쉘 옵션은 ( ) 사용을 활성화하고 , 일치하는 이름을 숨기거나( ), 일치하는 것이 없으면 패턴을 완전히 제거합니다( ).! -hsed**globstardotglobnullglob

또는 기본적으로 활성화되어 zsh있는 셸을 사용하고 **"glob 한정자"를 사용하여 bash명시적으로 수행해야 하는 대부분의 "추가" 작업을 수행할 수 있습니다.

for pathname in ./**/.sv(.DN); do
    sed -i -e '<command> -e '<command>' "$pathname"
done

glob 한정자는 (.DN)이전 와일드카드 패턴을 수정하여 일반 파일과만 일치하고 숨겨진 이름과 일치하며 전혀 일치하지 않으면 아무것도 확장하지 않도록 합니다.

답변2

나에게 도움이 된 또 다른 방법은 다음과 같습니다.

find -name "*.fail" | xargs -L 1 sed -i -e 's/cse/ecs/g' -e 's/trex/dino/g'

답변3

이것은 나에게 효과적입니다 grep -rl foo | xargs sed -i 's/foo/bar'

관련 정보