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 wget
os 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 -maxdepth
valor “1” definido para que o processo não saia do controle do seu sistema de arquivos e use uma echo
versã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 1
para algo como -maxdepth 9
ou até mesmo removê-lo completamente e, em seguida, comente a echo
linha e descomente a mv
linha 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 mv
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
.
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 rename
ferramenta 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 $newf
por echo $f $nf
e garantir que ele faça o que deseja.