Renomeando arquivos buscados via “wget --mirror” no Bash antes de fazer o upload para uma área estaticamente hospedada do Amazon S3

1

Estou tentando arquivar e fazer upload de um site antigo para a área Amazon S3 hospedada estaticamente.

Consegui obter o conteúdo com wget , usando o seguinte comando:

wget --mirror --no-parent --html-extension --page-requisites http://original.com

Então, eu poderia substituir todos os links para o novo URL, por:

ag -l original\.com -0 | xargs -0 sed -i '' \
's|original.com|old.original.com|g'

Depois disso, enviei o website para o Amazon S3 usando s3cmd sync .

Meu único problema agora é que todos os recursos "bloqueados pelo cache" agora são negados na Amazon. O problema é que wget tem os arquivos com parâmetros de consulta incluídos no nome do arquivo e eu preciso renomeá-los.

Por isso, gostaria de renomear os arquivos recursivamente, em todas as subpastas, como:

  • style.css?ver=4.2.5.css é renomeado para style.css

Como posso fazer isso no Mac OS X usando o Bash 3.2?

    
por hyperknot 29.09.2015 / 17:24

3 respostas

1

Isso deve funcionar:

find . -maxdepth 1 -type f -name '*\?*' |\
  while read FILENAME
  do
    IFS='?'
    SPLIT_FILENAME=(${FILENAME})
    unset IFS
    echo mv "${FILENAME}" "${SPLIT_FILENAME}"
    # mv "${FILENAME}" "${SPLIT_FILENAME}"
  done

O find . indica que toda a ação acontece no diretório atual, bem como nos diretórios filhos; sinta-se livre para mudar esse . para ser o caminho completo / real do que você está agindo. O -name '*\?*' procura arquivos com um ponto de interrogação ( ? ) em seu nome.

Esta versão inicial / demo também tem um -maxdepth definido para "1", então o processo não sai do controle em seu sistema de arquivos e usa uma versão echo do comando para mostrar o que ele faria antes de executá-lo de verdade.

Se você executar uma saída com boa aparência, sinta-se à vontade para ajustar o -maxdepth 1 para algo como -maxdepth 9 ou até mesmo removê-la totalmente e comentar a linha echo e descomentar a linha mv é assim:

find . -type f -name '*\?*' |\
  while read FILENAME
  do
    IFS='?'
    SPLIT_FILENAME=(${FILENAME})
    unset IFS
    # echo mv "${FILENAME}" "${SPLIT_FILENAME}"
    mv "${FILENAME}" "${SPLIT_FILENAME}"
  done

Usando o exemplo de arquivo de teste de style.css?ver=4.2.5.css , recebi essa saída ao executar esse script no sistema Mac OS X 10.9.5 (Mavericks):

mv ./style.css?ver=4.2.5.css ./style.css

Parece uma boa mudança para mim. Corri com o comando mv real e o arquivo foi renomeado com sucesso para style.css . Isso também funcionaria com arquivos que possuem espaços, como arquivos de teste como this is my style.css?ver=4.2.5.css e my style.css?ver=4.2.5.css .

    
por 29.09.2015 / 18:55
1

Isso funcionaria no Mac OS X, considerando que há apenas um único ? no URL / nome do arquivo original:

find . -name "*\?*" -exec sh -c 'var="{}" ; mv "{}" "${var%\?*}"' \;

Para referência, isso funcionaria também em sistemas Linux - ou em qualquer sistema - que tivesse a ferramenta rename instalada:

find . -name "*\?*" -exec rename "s/\?.*//" "{}" \;
    
por 29.09.2015 / 19:03
-1

Vou usar o echo para demonstrar.

# echo 'style.css?ver=4.2.5.css' | cut -d? -f2-9999
ver=4.2.5.css

Recursão:

cd <yourdir>
for f in *; do
    newf=$( echo $f | cut -d? -f2-9999 )
    mv $f $newf
done

Suposições: <yourdir> contém apenas os arquivos que você deseja alterar. Caso contrário, altere o for f in * glob para se adequar. Você deve testar o comando final primeiro com echo, ou seja, substituir mv $f $newf por echo $f $nf e garantir que ele faça o que você deseja.

    
por 29.09.2015 / 19:08