Adiciona extensão a todos os arquivos dentro de um diretório que contém uma string exata

3

Eu tenho um diretório grande com vários níveis e muitos arquivos. A maioria (mas não todos) desses arquivos são arquivos HTML, mas não têm a extensão .html (um problema ao copiar para o Windows).

Todos os arquivos HTML têm isso como uma linha primeiro :

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

Como posso, usando apenas um comando, adicionar a extensão .html a todos os arquivos que contêm essa string?

Eu vi esta pergunta SO , mas ela não renomeie com base se as contenções são uma string.

    
por esote 19.03.2017 / 02:08

2 respostas

3

Assumindo que todos os arquivos .html que não são extensões não têm nenhuma extensão, aqui está um script simples para realizar o que você precisa.

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

Este script faz o seguinte, na ordem:

  1. Localiza recursivamente todos os arquivos no diretório atual e nos diretórios filhos que não possuem a extensão .html .
  2. Verifica se a primeira linha dos arquivos encontrados é a string que você forneceu.
  3. Se a primeira linha corresponder, o arquivo será renomeado para incluir a extensão .html .
por 19.03.2017 / 03:39
0
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 {} +
    
por 19.03.2017 / 08:55