Pase los colors de ls a través de la tubería a la statement awk 'print'

Este es un seguimiento de mi pregunta de ayer, Mostrar sum de tamaños de file en la list de directorys .

Gracias a Zero Piraeus y un punto en la dirección correcta de Mauritz Hansen , ahora tengo

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

en mi .bash_profile , y funciona genial. Sin embargo, al less en Linux (todavía no he tenido la oportunidad de probarlo en OSX), donde estoy usando PuTTY en XP, mis colors dir ya no están. ¿Hay alguna forma de pasar los códigos de color a través de la tubería a la statement de print awk?

Actualizar

Gracias a la respuesta de Sukminder, agregar --color=always hace el truco, como se había establecido en auto antes. Sin embargo, ahora obtengo un espacio en blanco entre el final de la list del directory y la línea 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 ] $ 

Alguna sugerencia sobre arreglar esto?

Al usar ls --color=always los colors deben conservarse. Sin embargo, no estoy seguro si es específico de gnu. [ Editar desde OP: sí, lo es. ]

El caso es que ls detecta si la salida es a tty o no.

Si no es así, normalmente no imprimes colors y no traduces "caracteres no imprimibles" a signos de interrogación. Esto se puede agregar mediante la opción -q .

Más sobre el tema: Número de líneas emitidas por ls .


gnu coreutils fuente ls; árbitro. en algunos de los datos de colors:

  • definición enum.
  • enlace a la palabra de opción
  • definición de opción

Editar:

Para gnu coreutils ls: --color=always
Para ls de OS X: configure la variable de entorno CLICOLOR_FORCE y G significa color. El núcleo está conforme a ls IEEE Std 1003.1-2001 . Otras opciones son extensiones que recelan entre implementaciones.

DE ACUERDO. Tenía una mirada más profunda a esto. Aunque por lo que leo, las personas también instalan gnu coreutils en OS X, supongo que quizás utilices el original .

Las páginas del manual OS X para el estado ls :

 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. 

De la fuente:

Fuente Mac OS X 10.8.2 -> file_cmds-220.7 -> ls /

A partir de ese código también es rápidamente claro que uno puede establecer

 CLICOLOR_FORCE 

para forzar el color.

Como primero analiza arguments y setenv color en G :

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

Y después de analizar argv :

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

En la siguiente sección si TERM está establecido, se usa color:

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

echo $TERM debe producir un terminal con capacidad de color. Pero si obtienes los colors por normal, este debería ser el caso.

Editar hasta la última actualización:

No estoy seguro entonces Es extraño. No solo la línea adicional sino también que no tienes un total ... al principio. Puede comenzar comprobando el resultado de algo como esto:

 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); } ' } 

Debería darle algo como – ( De podría ser "-" por ejemplo, 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 : ""