기반으로이 답변, 디렉터리와 해당 하위 디렉터리의 모든 파일에 대해 작업을 수행하고 싶습니다.
다음 명령은 단일 파일에서 작동하지만 루프의 여러 파일에서도 작동합니다.
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
이 역시 마찬가지임), 패턴과 일치하는 이름이 없으면 쉘에 오류가 발생하도록 지시합니다.
차이점은 다음과 같습니다.
- 일치하는 파일의 파일 형식은 테스트되지 않습니다(패턴이 디렉터리 등과 일치할 수 있음).
- 패턴이 많이 일치하는 경우수천이름이 없으면 "매개변수 목록이 너무 김" 오류와 함께 명령이 실행되지 않습니다.