正確な文字列を含むディレクトリ内のすべてのファイルに拡張子を追加します。

正確な文字列を含むディレクトリ内のすべてのファイルに拡張子を追加します。

複数のレベルと多くのファイルを含む大きなディレクトリがあります。これらのファイルのすべてではありませんが、ほとんどはHTMLファイルですが、.html拡張子はありません(Windowsにコピーすると問題が発生します)。

すべてのHTMLファイルには次の内容があります。最初ワイヤー:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

.htmlコマンドのみを使用して、その文字列を含むすべてのファイルに拡張子をどのように追加できますか?

私はこれを見たことがあるだから質問はただし、文字列を含めるかどうかによって名前は変わりません。

答え1

拡張子以外のすべての.htmlファイルに拡張子がまったくないと仮定すると、必要なタスクを実行する単純なbashスクリプトがあります。

find . -type f ! -iname "*.html" -a ! -iname "*.htm" | while IFS= read -r file; do
    head -1 "${file}" | if grep -q '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">' ; then 
        mv "${file}" "${file}.html" 
    fi
done

スクリプトは次の操作を順番に実行します。

  1. .html現在のディレクトリとサブディレクトリで拡張子のないすべてのファイルを繰り返し検索します。
  2. 見つかったファイルの最初の行がユーザーが指定した文字列であることを確認します。
  3. 最初の行が一致すると、.htmlファイル名が拡張子を含むように変更されます。

答え2

goldn='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">' \
find . -type f \
   ! -name  '*.[hH][tT][mM]'     \
   ! -name '.*.[hH][tT][mM]'     \
   ! -name  '*.[hH][tT][mM][lL]' \
   ! -name '.*.[hH][tT][mM][lL]' \
-exec sh -c '
   shift "$1"
   while case $# in 0 ) break;; esac
   do
      read l1 < $1
      case $l1 in "$goldn" ) mv "$1" "$1.html";; esac
      shift
   done
' 2 1 {} +

関連情報