他のhtm.gz、html.gz、およびphp.gz Webファイルにはイメージがあり、.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' {} \;
これにより、すべてのファイルが開かれ、内部が見えますが、何も変更されません。どんな提案がありますか?