ls -l은 어떻게 출력을 깔끔하게 포맷합니까?


19

ls -l열 내용이 깔끔하게 정렬되도록 출력 형식을 어떻게 지정 합니까?

단말기

답변:


34

의 소스 코드는 GNU Savannah에서ls 온라인으로 찾아 볼 수 있습니다 . 대부분의 경우 필요한 최대 너비가 계산 된 후 (예 : 텍스트 기능 사용 ) 클래식 C 함수 형식 지정자와 일부 수동 패딩이 사용됩니다. 예를 들어, 함수를 참조 하고 .mbswidthprintfformat_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 --fstab합니다. 폴더의 유틸리티 - 리눅스 패키지는 심지어 라이브러리 "libsmartcols"이 정렬 된 테이블을 인쇄 할 findmnt, lsblk 등에 사용 (이전 libtt)와 함께 제공됩니다.
grawity

감사합니다. 나는 findmnt전에 사용 했지만, 이것도 할 수 있다는 것을 결코 깨닫지 못했습니다.
muru

알아두면 좋은 점 : Ubuntu / debian /bin/ls은 패키지 (GNU)의 일부입니다 coreutils. 를 실행하여 찾을 수 있습니다 dpkg-query -S /bin/ls. 패키지 이름을 알게되면, 당신은 다운로드 할 수 있는 바이너리 (이 중요하다) 내장 사용하여되는 우분투 패키지 정확한 소스 코드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에 표시합니다.

예를 들어, width의 현재 값이 5라고 가정하십시오.

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

인쇄합니다 : (간격을 유의하십시오)

   10   11

width여기가됩니다 scontext_width에 의해 계산 gooble_file, 다른 내가 언급 한 기능.
muru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.