ls --color:実行可能なハードリンクの色を指定するには?

ls --color:実行可能なハードリンクの色を指定するには?

NTFSドライブにいくつかのハードリンクを作成しましたが、これはハードリンク(複数のリンクを含む通常のファイル)ではなく、すべて実行可能で実行可能ファイルとして表示されます。

ext4ドライブでテストを実行しましたが、同じ問題が発生しました。 ls --colorを使用すると、複数のリンクが強調表示されているすべてのファイルがうまく強調されていますが、実行可能ビットがあれば「実行可能」色が表示されます(太字、強調表示されていません)。基本)。

さまざまなLS_COLOR設定を試しましたが、何も変更されません。

私の現在の〜/ .dir_colorsファイルは次のように単純化されています。

RESET 0
HARDLINK 44;37
#EXEC 01;32;41

私はこれをテストしました:

eval "$(dircolors ~/.dir_colors)"; ls -l --color

ファイルは色の変更、ハイライトなどで動作するようですが、HARDLINKの設定によっては、実行可能なハードリンクの色を指定することはできません。

更新:いくつかの調査の結果、「exeの色が優先されるようです」と言われています。 ls自体にハードコードされているようです。

もしそうなら、唯一の解決策は "ls"をカスタマイズすることです。そうですか?

答え1

まあ、ソースコードを見るとずっと行くしかありませんでした。 :)

現在のカスタムバージョンを作成する以外に、ハードリンクされていない実行可能ファイルとは異なるハードリンクされた実行可能ファイルの色を指定する方法はありません。エルエス

Ubuntu 10.04.4で実行する方法は次のとおりです。

sudo apt-get build-dep coreutils
apt-get source coreutils
cd coreutils-7.4

src/ls.c を次のように修正します。

$ diff coreutils-7.4/src/ls.c coreutils-7.4.custom/src/ls.c
4107,4108c4107,4108
<         else if ((mode & S_IXUGO) != 0)
<           type = C_EXEC;
---
> //      else if ((mode & S_IXUGO) != 0)
> //        type = C_EXEC;

その後、すべてをコンパイルします。

debuild -us -uc -b

コマンドはエラーで終わりますが、新しいコマンドをコンパイルします。エルエス存在するソース/ls、期待どおりに動作します。 :)

代替ソリューション:

  • BashまたはPythonを使用してlsと同じスクリプトを作成します。
  • 以前はハードリンクを見つけるためにいくつかのエイリアスを使用しました。

    エイリアス findHardLinkedFiles_SortByInode='find. -type f -links +1 -printf "inode=%i %s=サイズ nlinks=%n ファイル=%p \n" |sort-n'

    エイリアス findHardLinkedFiles_SortBySize='find. -type f -links +1 -printf "%s=サイズ nlinks=%n inode=%i ファイル=%p \n" |sort-n'

ターミナル出力の色付け方法:

答え2

KIAazeの回答に基づいてカスタム修正を思いつきました。 (coreutils 8.21を使用してUbuntu 14.04で実行されます)

インストール:(変更なし) - deb-srcリポジトリが有効になっていることを確認してください -

sudo apt-get build-dep coreutils
apt-get source coreutils
cd coreutils-8.21

(「build-dep coreutils」コマンド中にどのパッケージがインストールされたかを記録してください。最後にクリーンアップするには、そのパッケージが必要です。)

コード修正:(パッチはここにあります。)

追加: 「C_EXEC_HARDLINK」と「em」:

    列挙型を表示_no
      {
        C_LEFT、C_RIGHT、C_END、C_RESET、C_NORM、C_FILE、C_DIR、C_LINK、
        C_FIFO、C_SOCK、
        C_BLK、C_CHR、C_MISSING、C_ORPHAN、C_EXEC、C_DOOR、C_SETUID、C_SETGID、
        C_STICKY、C_OTHER_WRITABLE、C_STICKY_OTHER_WRITABLE、C_CAP、
C_MULTIHARDLINK、C_EXEC_HARDLINK、C_CLR_TO_EOL
      };

    静的const char *const表示_名前[]=
      {
        「lc」、「rc」、「ec」、「rs」、「no」、「fi」、「di」、「ln」、「pi」、「so」、
        「bd」、「cd」、「mi」、「or」、「ex」、「do」、「su」、「sg」、「st」、
        「あや」、「tw」、「ca」、「mh」、「それらを」、"cl"、空
      };

デフォルトの色設定:

    静的構造 bin_str color_indicator[] =
      {
        { LEN_STR_PAIR ("\033[") }, /* lc: 色順の左*/
        { LEN_STR_PAIR ("m") }, /* rc: 色順の右*/
        { 0, NULL }, /* ec: 終了色 (lc+no+rc 置換) */
        { LEN_STR_PAIR ("0") }, /* rs: 通常の色にリセット*/
        { 0, NULL }, /*いいえ: 正常*/
        { 0, NULL }, /* fi: ファイル: デフォルト */
        { LEN_STR_PAIR ("01;34") }, /* di: ディレクトリ: 明るい青*/
        { LEN_STR_PAIR ("01;36") }, /* ln: シンボリックリンク: 明るいターコイズ */
        { LEN_STR_PAIR ("33") }, /* pi: パイプ: 黄色/茶色*/
        { LEN_STR_PAIR ("01;35") }, /* だから: ソケット: 明るいマゼンタ */
        { LEN_STR_PAIR ("01;33") }, /* bd: ブロックデバイス: 明るい黄色*/
        { LEN_STR_PAIR ("01;33") }, /* cd: 文字デバイス: 明るい黄色*/
        { 0, NULL }, /* mi: 不足しているファイル: 未定義*/
        { 0, NULL }, /* または: 分離されたシンボリックリンク: 未定義*/
        { LEN_STR_PAIR ("01;32") }, /* 例: 実行可能ファイル: 明るい緑*/
        { LEN_STR_PAIR ("01;35") }, /* do: ドア: 明るいマゼンタ*/
        { LEN_STR_PAIR ("37;41") }, /* su: setuid: 赤の背景に白いテキスト */
        { LEN_STR_PAIR ("30;43") }, /* sg: setgid: 黄色の背景に黒いテキスト*/
        { LEN_STR_PAIR ("37;44") }, /* st: 粘着性: 青色の背景に黒いテキスト */
        { LEN_STR_PAIR ("34;42") }, /* ow: 他にも書くことができます: 青と緑 */
        { LEN_STR_PAIR ("30;42") }, /* tw: ow w/sticky: 緑の背景に黒*/
        { LEN_STR_PAIR ("30;41") }, /* ca: 赤の背景に黒いテキスト*/
        { 0, NULL }, /* mh: ハードリンク: デフォルトでは無効になっています */
        { 0, NULL }, /* em: 実行可能ハードリンク: デフォルトでは無効になっています */
        { LEN_STR_PAIR ("\033[K") }, /* cl: 行末まで消去*/
      };

上記または.bashrcスクリプトでは、次のようにカスタムカラーを設定できます。

export LS_COLORS="ln=01;36:mh=01;36:em=01;33";

望むより:端末のさまざまな色はどういう意味ですか?

優先順位ルールの設定:

        {
          タイプ= C_FILE;

          if((pattern&S_ISUID) != 0 && is_color(C_SETUID))
            タイプ= C_SETUID;
          そうでない場合((mode&S_ISGID)!= 0&&is_color(C_SETGID))
            タイプ= C_SETGID;
          else if (is_color (C_CAP) && f->has_capability)
            タイプ= C_CAP;
          そうでない場合((1 stat.st_nlink)&&(mode&S_IXUGO)!= 0&&is_color(C_EXEC_HARDLINK))
            タイプ= C_EXEC_HARDLINK;
          そうでない場合((mode&S_IXUGO)!= 0&&is_color(C_EXEC))
            タイプ= C_EXEC;
          else if((1 stat.st_nlink) && is_color(C_MULTIHARDLINK))
            タイプ= C_MULTIHARDLINK;
        }

その後、コンパイルします。 (コマンドはrootではなくユーザーとして実行する必要があります。)

debuild -us -uc -b

上記のコマンドを複数回実行できます。これにより、毎回コンパイルがクリーンアップされます(カスタマイズしたい場合)。

(KIAazeが述べたように、テストが完了するとテスト関連のエラーが返される可能性がありますが、「ls」コマンドは正しく機能します。)

最後に「ls」を交換してください。

sudo mv /bin/ls /bin/ls.orig
sudo mv src/ls /bin/ls

掃除する:

cd ..
rm -rf coreutils*
sudo apt-get remove <list of packages installed by 'build-dep coreutils'>

答え3

個人的には、ハードリンクの色がまずランダムだと思います。私はリンク数が2より大きい場合、長いリストのリンク数を強調表示するのが最善であることを発見しました。私のlsラッパースクリプトでこれを見ることができます。

http://www.pixelbeat.org/scripts/l

関連情報