o poder do unix
23/Jan/2009 @ 11:00 Software

Estava eu ontem à noite na caminha e com um olho já no sono e o outro a caminhar para lá, quando toca o telemóvel.
Lá peguei nele, olho para o visor e era um amigo meu que já não via há uns dois ou três anos.
Depois da conversa introdutória habitual (leia-se pôr o peixe minimamente em dia), lá muito atrapalhado me disse que estava numa encrenca com o seu site pessoal que estava a fazer e se não me importava de lá ir a casa para lhe dar uma mãozinha. Lá fui. É para isso que os amigos servem, afinal. Mesmo não estando em causa tirar ninguém da forca àquelas horas :P
A encrenca era que o meu amigo estava a fazer um site enorme a correr em Linux/Apache só em HTML estático (é um curioso interessado, mas ainda um bocadinho verde). Já tinha mais de cem ficheiros .html e lá dentro montes de links de uns para os outros, como é natural. Entretanto, decidiu aprender PHP para fazer umas flores e queria mudar a extensão dos ficheiros todos de .html para .php bem como nos links dentro deles. Começou por fazer ficheiro a ficheiro em Windows, mas depressa percebeu que seria tarefa para anos.
Ok meu, isso não custa nada:

Mudar a extensão dos ficheiros:
$ for x in *.html; do mv $x `basename $x .html`.php; done;

Mudar a extensão dos links internos de .html para .php com o bombom adicional de guardar um backup do original com a extensão .orig:
$ perl -pi.orig -e ‘s@.html@.php@g‘ *.php

Deve ter levado menos do que 1 minuto, só o tempo de pensar com as mãos e teclar simultaneamente.
O meu amigo ficou embasbacado (embora isto seja na verdade UNIX scripting completamente básico), desfez-se em palavras que não conseguia quase articular, pediu-me para ficar um bocado na conversa e beber um copo, mas eu estava a precisar mesmo era de voltar para casa e deixar-me cair nos braços de Morfeu.
Agora desafio um administrador de sistemas Windows a  fazer a mesma coisa, no mesmo tempo e com a mesma eficiência.

Don’t fear the power of UNIX.

[Actualização]: Não vale usar PERL nem REN que é um comando do MS-DOS. Só as ferramentas Windows que vêm bundled num Windows Server ou as que se podem sacar do site da Microsoft.

-MG
rss 16 pás de carvão
  1. Nuno
    23/Jan/2009 | 12:06

    ola
    como nao tenho medo do poder de Unix e nao sou administrador de windows respondo so a primeira :)

    ren *.html *.php
    (depois de mudar para a directoria onde estao os ficheiros a mudar)

    Nao tenho a certeza se percebi a 2a parte: e para no conteudo de todos os ficheiros em questao substituir a string “.html” por “.php”? Se for, nao sei fazer isto.


    A usar Mozilla Firefox Mozilla Firefox 3.0.5 em Windows Windows XP
  2. 23/Jan/2009 | 12:10

    Nuno: Sim, percebeste bem a 2a parte :)


    A usar Mozilla Firefox Mozilla Firefox 3.0.5 em Windows Windows Vista
  3. Nuno
    23/Jan/2009 | 12:14

    vou almocar e depois penso melhor nesta historia :)

    . o O (I see you’re trying to change a lot of filenames and the contents of text files. Would you like some help?)

    :D


    A usar Mozilla Firefox Mozilla Firefox 3.0.5 em Windows Windows XP
  4. Marco Barreto
    23/Jan/2009 | 12:19

    Psst. “ren” não é um comando de windows. É de DOS :)

    Abraço


    A usar Mozilla Firefox Mozilla Firefox 3.0.5 em Fedora Linux Fedora Linux
  5. Nuno
    23/Jan/2009 | 12:57

    Pensei que o Barreto estava na brincadeira com a historia do DOS Windows…


    A usar Mozilla Firefox Mozilla Firefox 3.0.5 em Windows Windows XP
  6. 23/Jan/2009 | 13:12

    Se estava a brincar ou não, isso só ele pode dizer. Mas lá que é verdade, é.


    A usar Mozilla Firefox Mozilla Firefox 3.0.5 em Windows Windows Vista
  7. 23/Jan/2009 | 14:03

    Embora estejam a chamar-lhe DOS, o CMD é um command line interpreter - e vem de série nos windows, portanto… é uma ferramenta válida.

    O ren era simples, tal como seria simples fazer em unix.
    Nao se poderia simplesmente fazer?
    mv *.html *.php

    quanto ao search replace, nao sei se seria possivel fazer no CLI (embora já tenha visto coisas “impossiveis” feitas em .bat files)

    A alternativa seria usar o vbscript - supondo que o Windows Server traga o Wscript ou coisa parecida (imagino que sim) - mas obrigaria certamente a mais umas linhas de código. Uma coisa tipo isto: http://www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx


    A usar Mozilla Firefox Mozilla Firefox 3.0.5 em Windows Windows XP
  8. 23/Jan/2009 | 14:20

    Quanto ao CMD, é um MS-DOS mal amanhado que só lá está por razões óbvias. Não é uma ferramenta Windows.

    Quanto ao search & replace, o que dizes é que é possível automatizar isso em Windows. Perfeitamente de acordo.
    Falhas é no requisito a bold: “desafio um administrador de sistemas Windows a fazer a mesma coisa, no mesmo tempo e com a mesma eficiência”.


    A usar Mozilla Firefox Mozilla Firefox 3.0.5 em Windows Windows Vista
  9. 23/Jan/2009 | 16:07

    Isso não é assim.
    O CMD é uma aplicação Windows e distribuída em todos os Windows desde o NT. Nem sequer é a mesma aplicação que para DOS, apenas suporta alguns dos comandos e inseriu muitos outros.
    De resto é uma aplicação Windows que faz uso da API Win32, etc. Aliás, há coisas em Windows que só consegues fazer pelo CMD.

    Como tal, CMD é Windows. Se usaste Perl na tua solução, ou fazes a solução em bash ou tb se compara com perl em Windows…


    A usar Mozilla Firefox Mozilla Firefox 3.0.5 em Windows Windows XP
  10. 23/Jan/2009 | 16:32

    “O CMD é uma aplicação Windows e distribuída em todos os Windows desde o NT. Nem sequer é a mesma aplicação que para DOS, apenas suporta alguns dos comandos e inseriu muitos outros.
    De resto é uma aplicação Windows que faz uso da API Win32, etc. Aliás, há coisas em Windows que só consegues fazer pelo CMD.”
    Ok, eu no Windows sou só um utilizador de desktop e nada mais. Não lhe conheço as entranhas a fundo.
    No entanto sabia que sendo ou não o CMD uma aplicação Windows, há coisas que só se podem fazer através dela. Mudar atributos de ficheiros e outras.

    Como tal, CMD é Windows. Se usaste Perl na tua solução, ou fazes a solução em bash ou tb se compara com perl em Windows…”
    Aqui estás errado. Experimenta lá remover o PERL do Linux, a ver o que acontece. Mas se o fizeres, que seja numa máquina que não tenha dados teus ou outra qualquer coisa de que necessites. Se o fizeres, estás por tua conta e risco.


    A usar Mozilla Firefox Mozilla Firefox 3.0.5 em Windows Windows Vista
  11. 23/Jan/2009 | 16:44

    Ok, concordo com a cena do perl. Mas podias fazer o mesmo com bash, penso eu.

    Em windows, eu preferia usar a PowerShell, a primeira coisa realmente de jeito a aparecer em Windows nos últimos … prai sempre.
    Eu não percebo muito de powershell, mas faria o rename assim:

    gci *.html | % { rename-item $_ $_.Name.Replace(”.html”, “.php”) }

    Em relação à segunda parte, podia fazer algo assim

    gci *.html -list |% { (gc $_.Path) | sc $_.Path + “.orig” |% { $_ -replace “.html”, “.php” } | sc $_.Path }

    A sintaxe é mais verbosa mas é também bastante genérica e tira partido do facto de serem usados objectos no powershell.

    Ruben


    A usar Mozilla Firefox Mozilla Firefox 3.0.5 em Windows Windows XP
  12. 23/Jan/2009 | 17:27

    “Ok, concordo com a cena do perl. Mas podias fazer o mesmo com bash, penso eu.”
    E em Python e em…

    “Em windows, eu preferia usar a PowerShell, a primeira coisa realmente de jeito a aparecer em Windows nos últimos … prai sempre.”
    Sim, tens razão.

    “Eu não percebo muito de powershell, mas faria o rename assim:

    gci *.html | % { rename-item $_ $_.Name.Replace(”.html”, “.php”) }

    Em relação à segunda parte, podia fazer algo assim

    gci *.html -list |% { (gc $_.Path) | sc $_.Path + “.orig” |% { $_ -replace “.html”, “.php” } | sc $_.Path }”

    Como disse, em Windows sou um utilizador. Tenho a PowerShell instalada, mas não lhe dou uso, porque não me interessa.
    De qq modo ainda nenhum sysadm Windows apareceu por aqui a aceitar o desafio. Foi malta do Linux :)

    Gamito


    A usar Mozilla Firefox Mozilla Firefox 3.0.5 em Windows Windows Vista
  13. MV
    23/Jan/2009 | 21:48

    Usando a shell do Windows (o CMD) q é o equivalente à shell do Unix…

    Mudar a extensao dos ficheiros:

    C:\>FOR %F in (*.HTML) DO MOVE %~NF.jpg ..\%~NF.PHP

    Mudar extensao de links internos aos ficheiros:

    C:\>edlin sar
    New file
    *i
    1:*1R.HTML^Z.PHP
    2:*E
    3:*^Z
    e

    C:\>FOR %F in (*.PHP) DO EDLIN %F < SAR

    Mais ajuste menos ajuste deve funcionar. Já nao debito BAT files há mto tempo :-). O 2o problema está resolvido com a criação em separado do file SAR, mas tb dá para passar como parametro (ECHO ZBRZBR…) mas fica mais complicado de perceber e nao me apetece :-)

    – MV


    A usar Mozilla Firefox Mozilla Firefox 3.0.5 em Windows Windows XP
  14. 23/Jan/2009 | 22:26

    Excelente comentário. Outra coisa não seria de esperar vinda do MV.
    Acho que para ti deverá ter dado para pensar e teclar em menos de 1 minuto e sem usar o REN, que é um comando MS-DOS, Indpendentemente de o CMD ser ou não uma aplicação Windows nativa. Logo, venceste (mais um) desafio.
    Acontece é que AFAIK não és sysadm Windows, right ? Portanto, foi um geek (nas suas próprias palavras) UNIX que o ganhou :)

    De sysadm Windows, nem sinal deles. Embora eu saiba pelos logs do Apache que passa por aqui muita máquina *.microsoft.com :P

    Ele há coisas fantásticas, não há ?

    – MG


    A usar Mozilla Firefox Mozilla Firefox 3.0.5 em Windows Windows Vista
  15. skizofrenik
    24/Jan/2009 | 00:40

    O mais engraçado é que ‘a malta do Linux’ practicamente usa toda Windows segundo o UA dos comentários..

    Há coisas fantásticas, não há?

    Cumps!
    skizofrenik


    A usar Internet Explorer Internet Explorer 7.0 em Windows Windows Vista
  16. 24/Jan/2009 | 00:59

    E podes crer que é verdade. Porque será ? Será do Guaraná ? Ou de outra coisa qualquer ?


    A usar Mozilla Firefox Mozilla Firefox 3.0.5 em Windows Windows Vista
atira-lhe uma pá de carvão

Nota: Todos os comentários são moderados.