다른 htm.gz, html.gz 및 php.gz 웹 파일에는 이미지가 있고 .jpg 형식 이미지에는 "-" 대신 공백이 포함된 이름이 있지만 모든 이미지가 있는 /images/ 디렉토리에는 " -" 공백 대신
HTML 파일에는 "<img class="photo" width="400" height="600" src="/images/red roses in summer 54.jpg" alt="">
"/images/" 디렉토리에는 모든 항목이 단어 사이에 "-"로 표시됩니다(예: "red-roses-in-summer-54.jpg").
그래서 내가 원하는 것은 /var/www/domain.com 내의 모든 htm.gz, html.gz 및 php.gz 파일을 검색하고 모든 .jpg 이미지를 찾아 공백을 "-"로 바꿀 수 있는 bash 명령/스크립트입니다. . 따라서 /images/red Roses in Summer 54.jpg에서 /images/red-roses-in-summer-54.jpg로
중요한 경우 서버는 centos 7에서 실행됩니다.
답변1
perl
이상적으로 이는 python
. 그러나 쉘 스크립트에서 이를 수행하려면 다음을 설치할 수 있습니다.XML2HTML을 플랫 파일 형식으로 변환하고 줄 기반 도구(예 : , , 등)와 함께 사용하기에 적합한 html2
이름이 지정된 도구를 제공하는 패키지입니다 .2html
sed
grep
awk
또한 XML 및 CSV 파일 작업을 위한 유사한 도구도 포함되어 있습니다.
sed
그런 다음 일치하는 줄의 공백을 대시로 변환을 사용할 수 있습니다 img src
. 그런 다음 다시 html로 변환합니다.
예를 들어 샘플 HTML 라인을 사용하면 다음과 같습니다.
$ cat file.html
<img class="photo" width="400" height="600" src="/images/red roses in summer 54.jpg" alt="">
$ html2 < file.html | sed -e '\:/img/@src=/images/: s/ /-/g' | 2html
<html><body><img class="photo" width="400" height="600" src="/images/red-roses-in-summer-54.jpg" alt="">
예를 들어 원본 파일을 수정된 버전으로 바꾸려면 출력을 리디렉션합니다 file.new.html
. mv -f file.new.html file.html
문제가 발생할 경우 알려진 양호한 시작 지점으로 복원할 수 있도록 원본 파일의 백업 복사본을 보관하는 것이 좋습니다.
그런데 결과 플랫 파일 형식은 html2
다음과 같습니다.
$ html2 < file.html
/html/body/img/@class=photo
/html/body/img/@width=400
/html/body/img/@height=600
/html/body/img/@src=/images/red roses in summer 54.jpg
/html/body/img/@alt
xml2
Debian 및 Ubuntu 및 기타 Linux 배포판용으로 패키지되었습니다. UNIX용으로 사전 패키지되어 있지 않은 경우 위 링크에서 소스 코드를 찾을 수 있습니다.
많은 수의 파일을 변경하는 방법에는 여러 가지가 있습니다. 다음은 간단한 for
루프 예제입니다.
for htmlfile in *.html ; do
html2 < "$htmlfile" |
sed -e '\:/img/@src=/images/: s/ /-/g' |
2html > "$htmlfile.new" \
&& mv -f "$htmlfile.new" "$htmlfile"
done
경고: 예상대로 작동하는지 테스트하세요.앞으로많은 수의 HTML 파일에서 실행하세요. 그리고 원본의 백업 복사본을 보관하세요. 파일의 HTML이 완전히 유효한 HTML이 아닌 경우(즉, HTML 구문 검사기를 통과하지 못한 경우) html2 | ... | 2html
HTML 파일이 기존보다 더 나빠질 수 있습니다.
파일이 너무 많거나 파일이 여러 하위 디렉터리에 있는 경우 이 방법을 사용해야 합니다 find ... -exec
. find
이 사이트에는 이를 사용하는 수많은 예가 있습니다.
답변2
뭔가를 찾았지만 잘 작동하지 않습니다.
find /var/www/domain.com -type f ! \( -name '*.db' -o -name '*.sqlite' -o -name '*.feed' -o -name '*.com' -o -name '*.xml' -o -name '*.gz' -o -name '*.txt' -o -name '*.pdf' -o -name '*.js' -o -name '*.css' -o -name '*.ico' -o -name '*.gif' -o -name '*.png' -o -name '*.jpg' -o -name '*.jpeg' \) -maxdepth 1 -exec sed -e '\:/img/@src=/images/: s/ /-/g' {} \;
이렇게 하면 모든 파일이 열리고 내부를 살펴보지만 아무것도 변경되지 않습니다. 어떤 제안이 있으십니까?