Renomear arquivos obtidos por meio de “wget --mirror” no Bash antes de fazer upload para uma área hospedada estaticamente no Amazon S3

Renomear arquivos obtidos por meio de “wget --mirror” no Bash antes de fazer upload para uma área hospedada estaticamente no Amazon S3

Estou tentando arquivar e fazer upload de um site antigo para uma área do 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 seu novo URL por:

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

Depois disso, carreguei o site no Amazon S3 usando s3cmd sync.

Meu único problema agora é que todos os ativos “quebrados em cache” agora têm acesso negado na Amazon. O problema é que wgetos arquivos com parâmetros de consulta estão incluídos no nome do arquivo e precisarei renomeá-los.

Então, eu gostaria de renomear os arquivos recursivamente, em todas as subpastas, como:

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

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

Responder1

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

Indica que find .toda a ação acontece no diretório atual, bem como nos diretórios filhos; sinta-se à vontade para alterá-lo .para o caminho de arquivo completo/real daquilo em que você está agindo. O -name '*\?*'procura por arquivos com um ponto de interrogação ( ?) em seu nome.

Esta versão inicial/demo também tem um -maxdepthvalor “1” definido para que o processo não saia do controle do seu sistema de arquivos e use uma echoversão do comando para mostrar o que ele faria antes de executá-lo de verdade.

Se você executar que a saída parece boa, sinta-se à vontade para ajustar -maxdepth 1para algo como -maxdepth 9ou até mesmo removê-lo completamente e, em seguida, comente a echolinha e descomente a mvlinha para que fique 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 seu exemplo de arquivo de teste style.css?ver=4.2.5.css, obtive esta saída ao executar este script em meu 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. Executei-o com o comando real mve 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.csse my style.css?ver=4.2.5.css.

Responder2

Isso funcionaria no Mac OS X, assumindo que haja apenas um único ?nome de arquivo URL/original:

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

Para referência, isso também funcionaria em sistemas Linux – ou qualquer sistema – que tenha a renameferramenta instalada:

find . -name "*\?*" -exec rename "s/\?.*//" "{}" \;

Responder3

Usarei 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 *globo para se adequar. Você deve testar o comando final primeiro com echo, ou seja, substituir mv $f $newfpor echo $f $nfe garantir que ele faça o que deseja.

informação relacionada