ls -lは出力をどのようにきれいにフォーマットしますか?


19

ls -l列の内容がきれいに揃うように、出力をどのようにフォーマットしますか?

ターミナル

回答:


34

のソースコードはlsGNUサバンナでオンラインで閲覧できます。ほとんどの場合、必要な最大幅が計算され(たとえば、mbswidthテキスト用の関数を使用)、従来のC printf関数形式指定子といくつかの手動パディングが使用されます。たとえば、関数format_user_or_group()およびを参照してくださいgobble_file()

TL; DR:「魔法」はありません。ただ多くのうっとうしい計算です。


独自の出力にこのようなきちんとしたテーブルが必要な場合は、次を使用しますcolumn

$ grep -vE '^#' /etc/fstab
UUID=cdff3742-9d03-4bc1-93e3-ae50708474f2 /               ext4    errors=remount-ro 0       1
/dev/mapper/lvmg-homelvm /home           btrfs   defaults,compress=lzo,space_cache,relatime 0       2
UUID="bb76cd0d-ae1d-4490-85da-1560c32679cd" none    swap sw 0 0
UUID="a264b1b1-cf82-40aa-ab9e-a810cfba169a" /home/muru/arch     btrfs defaults,compress=lzo,space_cache,relatime 0       2

$ grep -vE '^#' /etc/fstab | column -t
UUID=cdff3742-9d03-4bc1-93e3-ae50708474f2    /                ext4   errors=remount-ro                           0  1
/dev/mapper/lvmg-homelvm                     /home            btrfs  defaults,compress=lzo,space_cache,relatime  0  2
UUID="bb76cd0d-ae1d-4490-85da-1560c32679cd"  none             swap   sw                                          0  0
UUID="a264b1b1-cf82-40aa-ab9e-a810cfba169a"  /home/muru/arch  btrfs  defaults,compress=lzo,space_cache,relatime  0  2

4
/ etc / fstabを例として使用した場合、提案するしかありませんfindmnt --fstabUTIL-Linuxのパッケージでも、それが整列表を印刷するなどfindmnt、lsblk、で使用するライブラリ「libsmartcols」(以前libtt)が付属しています。
悲しみ

@grawityいいね。私はfindmnt前に使用したことがありますが、それがこれを行うことができることに気づきませんでした。
ムル

知っておきたいこと:Ubuntu / debian /bin/lsはパッケージ(GNU)の一部ですcoreutils。これはを実行して見つけることができますdpkg-query -S /bin/ls。あなたは、パッケージ名を知ったら、ダウンロードすることができます任意の使用して(これは重要です)バイナリが構築されたUbuntuのパッケージの正確なソースコードをapt-get source <package_name>
arielf

17

@muruの答えに加えて、出力の正当な理由を計算 するソースコードの一部を次にwidth示します。:

static void
format_user_or_group (char const *name, unsigned long int id, int width)
{
  size_t len;

  if (name)
    {
      int width_gap = width - mbswidth (name, 0);
      int pad = MAX (0, width_gap);
      fputs (name, stdout);
      len = strlen (name) + pad;

      do
        putchar (' ');
      while (pad--);
    }
  else
    {
      printf ("%*lu ", width, id);
      len = width;
    }

  dired_pos += len + 1;
}

を使用しprintf ("%*lu ", width, id);ます。注: 可変フィールド幅指定子'*'

この場合、ls -l実行時に必要なフィールド幅の大きさを予測することはできません。つまり、ディレクトリ名の長さが異なる場合があります。これは、フィールド幅自体が変数である必要があることを意味しますプログラムが値を計算するでしょう

Cは、フィールド幅指定子の位置にアスタリスクを使用して、追加パラメーターとしてフィールド幅の値を含む変数を見つけることをprintfに示します。

たとえば、幅の現在の値が5であると仮定します。ステートメント:

printf ("%*d%*d\n", width, 10, width, 11);

印刷されます:(間隔に注意してください)

   10   11

widthここにあるscontext_widthによって算出した、gooble_file他の私が言及した機能。
ムル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.