Passa as cores de ls a pipe para awk 'print' statement

6

Esta é uma continuação da minha pergunta de ontem, Mostrar a soma dos tamanhos dos arquivos na listagem de diretórios .

Graças a Zero Piraeus e um ponto na direção certa por Mauritz Hansen , agora tenho

function dir() {
        ls -FaGl "${@}" | awk '{print; total += $4}; END {print "\t\ttotal: ",total/1024,"KB"}'
}

no meu .bash_profile e funciona muito bem. No entanto, pelo menos no Linux (ainda não tive a chance de experimentá-lo no OSX), onde estou% usando o PuTTY no XP, minhas cores dir desapareceram. Existe alguma maneira de passar os códigos de cores através do pipe para a declaração awk ssh ?

Atualizar

Graças a resposta da Sukminder, adicionar print é o resultado, já que foi definido como --color=always antes. No entanto, agora obtenho um espaço em branco entre o final da listagem de diretórios e a linha total:

[19:30:58 mattdmo@server ~/webapps/django15 ] $ dir
drwxr-xr-x  7 mattdmo 4096 Mar 24 20:28 ./
drwxr-xr-x 17 root    4096 Mar 18 20:15 ../
drwxr-xr-x  7 mattdmo 4096 Mar 14 14:57 apache2/
drwxr-xr-x  3 mattdmo 4096 Mar 14 14:57 bin/
drwxr-xr-x  2 mattdmo 4096 Mar 24 20:10 lib/
drwxr-xr-x  3 mattdmo 4096 Mar 14 14:57 myproject/
drwxrwxr-x  3 mattdmo 4096 Mar 24 20:28 pigimal/

                total:  28 KB
[19:30:59 mattdmo@server ~/webapps/django15 ] $

Alguma sugestão para consertar isso?

    
por MattDMo 17.04.2013 / 19:47

1 resposta

7

Usando ls --color=always , as cores devem ser preservadas. Não tenho certeza se é gnu específico embora. [ Editar do OP: sim, é. ]

O caso é que ls detecta se a saída é tty ou não.

Se não é normal, não imprima cores e não traduza "caracteres não imprimíveis" para pontos de interrogação. Isso pode ser adicionado pelo -q   opção .

Mais sobre o assunto: Número de linhas geradas por ls .

gnu coreutils fonte ls; ref. em alguns dos dados de cores:

Editar:

Para o gnu coreutils ls: --color=always
Para ls do OS X: defina a variável de ambiente CLICOLOR_FORCE e G significa cor. o core está em conformidade com ls IEEE Std 1003.1-2001 . Outras opções são extensões que desconfiam das implementações.

OK. Eu tinha uma visão mais profunda disso. Embora do que eu li em torno de pessoas também instalar o gnu coreutils no OS X, eu acho que você talvez use o original .

As páginas de manual do OS X para ls estado:

CLICOLOR_FORCE  
    Color sequences are normally disabled if the output isn't directed to a
    terminal.  This can be overridden by setting this flag.  The TERM 
    variable still needs to reference a color capable terminal however
    otherwise it is not possible to determine which color sequences to use.

Da fonte:

Origem do Mac OS X 10.8.2 - > file_cmds-220.7 - > ls /

A partir desse código também fica claro que é possível definir

CLICOLOR_FORCE

para forçar a cor.

Como ele primeiro analisa argumentos e setenv color em G :

    case 'G':
        setenv("CLICOLOR", "", 1);
        break;

E após argv de análise:

/* CLICOLOR is set    AND    is a tty            OR */
if (getenv("CLICOLOR") && (isatty(STDOUT_FILENO) || 
etenv("CLICOLOR_FORCE")))
/*  force cli color is set */

Na próxima seção, se TERM estiver definido, a cor será usada:

if (tgetent(termcapbuf, getenv("TERM")) == 1) {

echo $TERM deve render um terminal com capacidade de cor. Mas se você conseguir cores por normal, este deve ser o caso.

---

Editar para a última atualização:

Não tenho certeza então. Isto é estranho. Não só a linha extra mas também que você faz não tem total ... no início. Você poderia começar verificando o saída de algo como isto:

function dir() {
/bin/ls -FaGl "${@}" | awk '
    function chr2hex(chr) {
        return sprintf("%02x", index(i2x, chr));
    }
    function str2hex(str) {
        r = ""
        for (i = 1; i <= length(str); ++i)
            r = r chr2hex(substr(str, i, 1));
        return r;
    }
    BEGIN {
        i2x = ""
        for (i = 0; i < 256; ++i)
            i2x = sprintf("%s%c", i2x, i);
        printf("FNR        : %d\n", FNR);
        printf("FIELDWIDTHS: \"%s\"\n", FIELDWIDTHS);
        printf("FS         : \"%s\"\n", str2hex(FS));
        printf("RS         : \"%s\"\n", str2hex(RS));
        printf("OFS        : \"%s\"\n", str2hex(OFS));
        printf("ORS        : \"%s\"\n", str2hex(OFS));
    }
    {
        printf("%2d:%2d:%2d \"%s\"\n", FNR, NR, NF, $0);
        total += $4;
    }
    END {
        printf("%21s: %d %s\n", "total", total / 1024, "KiB");
        printf("FNR        : %d\n", FNR);
        printf("From       : \"%s\"\n", FILENAME);
    }
'
}

Deve dar-lhe algo como - ( De pode ser "-" , por exemplo, gawk):

$ ./dir testdir
FNR        : 0
FIELDWIDTHS: ""
FS         : "20"
RS         : "0a"
OFS        : "20"
ORS        : "20"
 1: 1: 2 "total 24"
 2: 2: 8 "drwxrwxr-x 6 mattdmo 4096 Apr 17 21:46 ./"
 3: 3: 8 "drwxrwxr-x 8 mattdmo 4096 Apr 18 10:47 ../"
 4: 4: 8 "drwxrwxr-x 2 mattdmo 4096 Apr 17 21:46 ab1/"
 5: 5: 8 "drwxrwxr-x 2 mattdmo 4096 Apr 17 21:46 ab2/"
 6: 6: 8 "drwxrwxr-x 2 mattdmo 4096 Apr 17 21:46 ab3/"
 7: 7: 8 "drwxrwxr-x 2 mattdmo 4096 Apr 17 21:46 ab4/"
                total: 24 KB
FNR        : 7
From       : ""
    
por 17.04.2013 / 20:02