Encontre o arquivo, verifique o tamanho e sobrescreva quando o tamanho do arquivo é diferente

3

Hoje eu encontrei um pequeno bug no meu próprio CMS escrito. Agora eu quero reescrever todos os arquivos no servidor com o mesmo nome de arquivo. No entanto, tenho alguns clientes com o arquivo específico personalizado, por isso não posso sobrescrever todos os arquivos.

Como alguns clientes têm um arquivo personalizado, preciso verificar o tamanho do arquivo.

Quando o tamanho do arquivo é diferente de sua origem, ele deve substituir. Quando é o mesmo tamanho de arquivo, ele deve pular o arquivo.

Alguns meses atrás eu fiz uma pergunta um pouco semelhante, como sobrescrever vários arquivos de uma fonte. Eu consegui também consertar isso com:

echo /home/*/*/phpthumb | xargs -t -n 1 cp -r /home/test/testuser/phpthumb/*

Posso usar isso em um script .sh com um pequeno if / else para reescrever ou pular o arquivo? Se sim, como posso conseguir isso?

Minha experiência unix é mediana, então, se algo não estiver claro sobre a minha pergunta, sinta-se à vontade para perguntar.

Atenciosamente.

    
por Jordy 29.12.2014 / 16:30

2 respostas

3

Suponho que você alterou o código-fonte em um dos seus arquivos de origem em um dos seus servidores e deseja portar a correção para outros sites, certo? Se você manteve uma cópia do arquivo orginial (eu sempre faço quando não conheço o projeto de cor), use seu melhor recurso: diff :

diff -Nau old/file new/file > file.patch

Você terá um diferencial entre os arquivos de origem originais e corrigidos, com os quais você pode corrigir todos os servidores, por meio do SSH, por exemplo:

# See what's to be done, no action
cat file.patch | ssh server "patch -d <directory> --dry-run"
# Apply the patch if all seems good
cat file.patch | ssh server "patch -d <directory>"

Você pode ter que ajustar o cabeçalho do patch se a cópia inalterada estiver em um diretório diferente do arquivo corrigido. Mas basicamente, se ambos estiverem no mesmo diretório, file.php é o arquivo fixo e file.php.orig o original, cd para o diretório raiz do seu site e execute o comando diff , por exemplo:

cd /home/www/htdocs/www.mysite.tld
diff -Nau some/deep/dir/file.orig.php some/deep/dir/file.php > /tmp/file.patch

A partir do diretório raiz de outros sites:

# See what's to be done, no action
patch -d /home/www/htdocs/www.my.other.site.tld --dry-run < /tmp/file.patch
# Apply the patch if all seems good
patch -d /home/www/htdocs/www.my.other.site.tld < /tmp/file.patch

Outro argumento útil é -p . Tanto diff como patch podem trabalhar em uma árvore de diretórios para aplicar correções recursivamente. Você também pode criar um patch mais complexo, concatenando-os em um arquivo. Veja patch --help e diff --help para mais detalhes sobre como usá-los.

    
por 29.12.2014 / 17:15
2

De acordo com a sua pergunta original, isto é o que você quer, mas veja o meu comentário abaixo. Você pode tentar apenas a parte find por conta própria para ter certeza de ter os arquivos corretos.

find /home -maxdepth 3 -mindepth 3 -path */phpthumb/filename ! -size xxxx |
  xargs -t -n 1 cp /home/test/testuser/phpthumb/filename

Para que isso funcione de acordo com o meu comentário e substitua os de mesmo tamanho, basta soltar o ! .

Atualizar

Na verdade, comparar as somas MD5 é a melhor maneira de fazer isso. É mais robusto, pois pode ser que um dos seus arquivos personalizados seja do mesmo tamanho. Você poderia tentar:

original_md5=$(md5sum /path/to/original | awk '{print $1}')
echo /home/*/*/phpthumb/filename |
  xargs md5sum |
  grep "^$original_md5" |
  awk '{print $2}' |
  xargs -t -n 1 cp /home/test/testuser/phpthumb/filename

Isso substitui todos os arquivos correspondentes ao original. Para fazer isso de acordo com a sua pergunta na íntegra, adicione a opção -v a grep . Note também que nenhuma dessas respostas funcionará se houver espaços em qualquer um dos caminhos de busca (caso eles tenham sido adicionados desde a última pergunta).

    
por 29.12.2014 / 16:43