web-dev-qa-db-ja.com

lsからパイプを介してawk'print 'ステートメントに色を渡します

これは昨日からの私の質問のフォローアップです ディレクトリリストにファイルサイズの合計を表示します

Zero PiraeusMauritz Hansen による正しい方向のポイントのおかげで、私は今持っています

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

私の.bash_profileで、それはうまく機能します。ただし、少なくともLinux(OSXで試す機会はまだありません)では、XPでPuTTYを使用する際にsshingしているため、ディレクトリの色がなくなりました。パイプを介してawkprintステートメントにカラーコードを渡す方法はありますか?

更新

Sukminderの answer のおかげで、以前はautoに設定されていたので、--color=alwaysを追加するとうまくいきます。ただし、ディレクトリリストの最後と合計行の間に空白が表示されます。

[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 ] $

これを修正するための提案はありますか?

8
MattDMo

ls --color=alwaysを使用することにより、色を保持する必要があります。それがgnu固有であるかどうかはわかりませんが。 [OPから編集:はい、そうです。]

ケースは、lsが出力がttyであるかどうかを検出する場合です。

そうでない場合は、通常、色を印刷せず、「印刷できない文字」を疑問符に変換しません。これは、-qoption で追加できます。

主題の詳細: lsによって出力される行数


gnu coreutils source ls;参照。いくつかの色データについて:


編集:

Gnu coreutils lsの場合:--color=always
OS Xのlsの場合:環境変数CLICOLOR_FORCEを設定します。Gは色を意味します。コアは ls IEEE Std 1003.1-2001 に準拠しています。他のオプションは、実装間で警告する拡張機能です。

OK。これをもっと深く見ていた。私が読んだことから、人々はOSXにgnucoreutilsもインストールしていますが、おそらくoriginalを使用していると思います。

lsのOS Xマニュアルページ 状態:

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.

ソースから:

Mac OS X 10.8.2ソース -> file_cmds-220.7 -> ls /

そのコードから、設定できることもすぐにわかります

CLICOLOR_FORCE

色を強制します。

最初に引数とsetenvの色をGで解析するとき:

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

そしてargv解析後:

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

次のセクションでは、TERMが設定されている場合、色が使用されます。

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

echo $TERMは、カラー対応の端末を生成する必要があります。しかし、あなたが通常通りに色を得るならば、これは事実であるはずです。

---

最後の更新まで編集:

わからない。変です。余分な行だけでなく、最初にtotal ...がないことも。次のような出力を確認することから始めることができます。

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

–(From"-"(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       : ""
10
Runium