디렉터리 및 해당 하위 디렉터리의 모든 파일에 대해 반복적으로 작업을 수행합니다.

디렉터리 및 해당 하위 디렉터리의 모든 파일에 대해 반복적으로 작업을 수행합니다.

기반으로이 답변, 디렉터리와 해당 하위 디렉터리의 모든 파일에 대해 작업을 수행하고 싶습니다.

다음 명령은 단일 파일에서 작동하지만 루프의 여러 파일에서도 작동합니다.

for i in *.html; \
do sed -i '/<head>/a <link rel="stylesheet" href="/home/jian/postgres/doc/src/sgml/html/stylesheet.css">\' $i; \
done

그러나 아래 명령은 작동하지 않습니다.

find . -type d -exec \
    for i in *.html; \
    do sed -i '/<head>/a <link rel="stylesheet" href="/home/jian/postgres/doc/src/sgml/html/stylesheet.css">\' $i; \
    done \
 \;

다음과 같은 오류가 발생합니다.

bash: syntax error near unexpected token `do'
bash: syntax error near unexpected token `done'
;: command not found

관련 포스팅을 찾았어요여기.

답변1

현재 디렉터리 또는 일치하는 이름을 가진 다음 디렉터리의 모든 일반 파일을 호출합니다 sed.find*.html

find . -name '*.html' -type f -exec sed -i '...expression...' {} +

sed위 코드에 표현식을 올바르게 삽입했다고 가정하면 sed찾은 파일의 배치 경로 이름이 호출됩니다. sed호출이 다음과 같은지 확인하세요.희귀한가능한 한 여러 번.

또는,

shopt -s globstar dotglob failglob

sed -i '...expression...' ./**/*.html

이렇게 하면 **패턴이 *경로 이름 내에서 일치하는 것처럼 작동하게 됩니다 /("재귀적으로"). 또한 패턴 일치를 통해 이름을 숨길 수 있으며( find이 역시 마찬가지임), 패턴과 일치하는 이름이 없으면 쉘에 오류가 발생하도록 지시합니다.

차이점은 다음과 같습니다.

  1. 일치하는 파일의 파일 형식은 테스트되지 않습니다(패턴이 디렉터리 등과 일치할 수 있음).
  2. 패턴이 많이 일치하는 경우수천이름이 없으면 "매개변수 목록이 너무 김" 오류와 함께 명령이 실행되지 않습니다.

관련 정보