bash: "du" 디스플레이 출력을 "ncdu"와 유사하게 만듭니다.

bash: "du" 디스플레이 출력을 "ncdu"와 유사하게 만듭니다.

Linux에서 ncduNCurses 디스크 사용 도구의 일부 샘플 출력은 다음과 같습니다.

주문하다:

ncdu /boot
ncdu 1.14.1 ~ Use the arrow keys to navigate, press ? for help 
--- /boot -----------------------------------------------------
  100.2 MiB [##########]  initrd.img-5.13.0-28-generic         
  100.2 MiB [######### ]  initrd.img-5.13.0-27-generic
   11.2 MiB [#         ]  vmlinuz-5.11.0-46-generic
    9.7 MiB [          ]  vmlinuz-5.13.0-28-generic
    9.7 MiB [          ]  vmlinuz-5.13.0-27-generic
    9.7 MiB [          ]  vmlinuz-5.13.0-25-generic
    8.0 MiB [          ] /grub
    5.7 MiB [          ]  System.map-5.13.0-28-generic
    5.7 MiB [          ]  System.map-5.13.0-27-generic
    5.7 MiB [          ]  System.map-5.13.0-25-generic
    5.6 MiB [          ]  System.map-5.11.0-46-generic
  252.0 KiB [          ]  config-5.13.0-28-generic
  252.0 KiB [          ]  config-5.13.0-27-generic
  252.0 KiB [          ]  config-5.13.0-25-generic
  252.0 KiB [          ]  config-5.11.0-46-generic
  184.0 KiB [          ]  memtest86+_multiboot.bin
  184.0 KiB [          ]  memtest86+.elf
  180.0 KiB [          ]  memtest86+.bin
!  16.0 KiB [          ] /lost+found
!   4.0 KiB [          ] /efi
@   0.0   B [          ]  initrd.img.old
@   0.0   B [          ]  initrd.img
@   0.0   B [          ]  vmlinuz.old
@   0.0   B [          ]  vmlinuz

그러나 이는 인간-컴퓨터 상호 작용 프로그램이므로 출력을 스크립트로 작성할 수 없습니다. 변수에 저장하고 싶은데 비슷한 출력을 얻으려면 어떻게 해야 합니까 du?

이것은 내 질문에 대한 후속 질문입니다.ncdu디스크 사용량을 빠르게 표시하고 종료하는 방법은 무엇입니까 ?

최종 용도는 다음과 같습니다.

output_before="$(du /boot)"
# do a bunch of stuff here which reduces the size of /boot
output_after="$(du /boot)"
echo "Before:"
echo "$output_before"
echo ""
echo "After:"
echo "$output_after"

이것은 시작이지만 가장 큰 것부터 가장 작은 것까지 올바른 내림차순으로 출력을 표시하지 않습니다.

du --all --max-depth=1 -h /boot

내가 가장 보고 싶은 것은:

--- /boot -----------------------------------------------------
  100.2 MiB [##########]  initrd.img-5.13.0-28-generic         
  100.2 MiB [######### ]  initrd.img-5.13.0-27-generic
   11.2 MiB [#         ]  vmlinuz-5.11.0-46-generic
    9.7 MiB [          ]  vmlinuz-5.13.0-28-generic
    9.7 MiB [          ]  vmlinuz-5.13.0-27-generic
    9.7 MiB [          ]  vmlinuz-5.13.0-25-generic
    8.0 MiB [          ] /grub
    5.7 MiB [          ]  System.map-5.13.0-28-generic
    5.7 MiB [          ]  System.map-5.13.0-27-generic
    5.7 MiB [          ]  System.map-5.13.0-25-generic
    5.6 MiB [          ]  System.map-5.11.0-46-generic
  252.0 KiB [          ]  config-5.13.0-28-generic
  252.0 KiB [          ]  config-5.13.0-27-generic
  252.0 KiB [          ]  config-5.13.0-25-generic
  252.0 KiB [          ]  config-5.11.0-46-generic
  184.0 KiB [          ]  memtest86+_multiboot.bin
  184.0 KiB [          ]  memtest86+.elf
  180.0 KiB [          ]  memtest86+.bin
   16.0 KiB [          ] /lost+found
    4.0 KiB [          ] /efi
    0.0   B [          ]  initrd.img.old
    0.0   B [          ]  initrd.img
    0.0   B [          ]  vmlinuz.old
    0.0   B [          ]  vmlinuz

그러나 허용되는 최소 답변은 다음과 같습니다.

  100.2 MiB  /boot/initrd.img-5.13.0-28-generic         
  100.2 MiB  /boot/initrd.img-5.13.0-27-generic
   11.2 MiB  /boot/vmlinuz-5.11.0-46-generic
    9.7 MiB  /boot/vmlinuz-5.13.0-28-generic
    9.7 MiB  /boot/vmlinuz-5.13.0-27-generic
    9.7 MiB  /boot/vmlinuz-5.13.0-25-generic
    8.0 MiB  /boot/grub
    5.7 MiB  /boot/System.map-5.13.0-28-generic
    5.7 MiB  /boot/System.map-5.13.0-27-generic
    5.7 MiB  /boot/System.map-5.13.0-25-generic
    5.6 MiB  /boot/System.map-5.11.0-46-generic
  252.0 KiB  /boot/config-5.13.0-28-generic
  252.0 KiB  /boot/config-5.13.0-27-generic
  252.0 KiB  /boot/config-5.13.0-25-generic
  252.0 KiB  /boot/config-5.11.0-46-generic
  184.0 KiB  /boot/memtest86+_multiboot.bin
  184.0 KiB  /boot/memtest86+.elf
  180.0 KiB  /boot/memtest86+.bin
   16.0 KiB  /boot/lost+found
    4.0 KiB  /boot/efi
    0.0   B  /boot/initrd.img.old
    0.0   B  /boot/initrd.img
    0.0   B  /boot/vmlinuz.old
    0.0   B  /boot/vmlinuz

답변1

python읽어야 할 작은 스크립트 ncdu -o-:

read_ncdu.py:

#!/usr/bin/env python3

import sys, json

def sizeof_fmt(num, suffix='B'):
    for unit in ['','Ki','Mi','Gi','Ti','Pi','Ei','Zi']:
        if abs(num) < 1024.0:
            return "%3.1f%s%s" % (num, unit, suffix)
        num /= 1024.0
    return "%.1f%s%s" % (num, 'Yi', suffix)

def get_recursive(item):
    size = 0
    if isinstance(item, dict):
        name = item["name"]
        size = item["asize"]
    else:
        name = item[0]["name"]
        for sub in item:
            size += get_recursive(sub)[1]
    return (name, size)

data = json.loads(sys.stdin.read())

items=[]
for i in data[3][1:]:
    items.append(get_recursive(i))

sum_sizes = sum([item[1] for item in items])
biggest = max([item[1] for item in items])
print("------ {} --- {} -------".format(data[3][0]["name"], sizeof_fmt(sum_sizes)))

for item in sorted(items, key=lambda x:x[1], reverse=True):
    size=item[1]
    hsize=sizeof_fmt(item[1])
    name=item[0]
    percent=(size/sum_sizes*100)
    percent_str="({:.1f}%)".format(percent)
    
    print("{} {:8} [{}{}] {}".format(
        " " * (10 - len(str(hsize)))+ str(hsize),
        " " * (8 - len(percent_str)) + percent_str,  
        ('#' * round(size/biggest*10)),
        ('-' * round(10-size/biggest*10)),
        item[0])
    )

스크립트를 개선하고 싶을 수도 있습니다.

  • 원하는 경우 (겉보기 크기 dsize) 대신 (디스크 크기)를 사용 asize하거나 스크립트에 매개변수를 도입하여 사용자가 결정할 수 있도록 할 수 있습니다.
  • os.walk()대신 입력을 사용하면 스크립트가 독립적이 됩니다 ncdu -o-.

당신은 또한 볼 수 있습니다여기json 출력 형식에 대한 지침입니다 ncdu.

달리기:

실행 가능 하게 만들고 read_ncdu.py--> chmod +x read_ncdu.py다음을 실행할 수 있습니다.

ncdu -o- /boot | ./read_ncdu.py

산출:

------ /boot --- 224.3MiB -------
   56.8MiB  (25.3%)  [##########]  initrd.img-5.13.0-28-generic
   56.7MiB  (25.3%)  [##########]  initrd.img-5.13.0-27-generic
   55.4MiB  (24.7%)  [##########]  initrd.img-5.11.0-46-generic
   11.2MiB  (5.0%)   [##--------]  vmlinuz-5.11.0-46-generic
    9.7MiB  (4.3%)   [##--------]  vmlinuz-5.13.0-28-generic
    9.7MiB  (4.3%)   [##--------]  vmlinuz-5.13.0-27-generic
    6.5MiB  (2.9%)   [#---------]  grub
    5.7MiB  (2.5%)   [#---------]  System.map-5.13.0-28-generic
    5.7MiB  (2.5%)   [#---------]  System.map-5.13.0-27-generic
    5.6MiB  (2.5%)   [#---------]  System.map-5.11.0-46-generic
  251.7KiB  (0.1%)   [----------]  config-5.13.0-28-generic
  251.6KiB  (0.1%)   [----------]  config-5.13.0-27-generic
  248.1KiB  (0.1%)   [----------]  config-5.11.0-46-generic
  180.6KiB  (0.1%)   [----------]  memtest86+_multiboot.bin
  180.1KiB  (0.1%)   [----------]  memtest86+.elf
  178.4KiB  (0.1%)   [----------]  memtest86+.bin
   16.0KiB  (0.0%)   [----------]  lost+found
     28.0B  (0.0%)   [----------]  initrd.img
     28.0B  (0.0%)   [----------]  initrd.img.old
     25.0B  (0.0%)   [----------]  vmlinuz
     25.0B  (0.0%)   [----------]  vmlinuz.old

답변2

이는 다음을 제공합니다가장 낮은 대답, 질문에 따르면 :

du --all --max-depth=1 -h /boot | sort -rh

질문의 예를 기반으로 한 사용 예(그러나 실행 가능한 스크립트를 만들지 않고도 터미널에 복사하여 붙여넣을 수 있도록 "한 줄" 명령으로 작성됨):

output="$(du --all --max-depth=1 -h /boot | sort -rh)"; \
echo "Before:"; \
echo "$output"

표준 출력으로의 출력 예:

Before:
273M    /boot
101M    /boot/initrd.img-5.13.0-28-generic
101M    /boot/initrd.img-5.13.0-27-generic
12M /boot/vmlinuz-5.11.0-46-generic
9.8M    /boot/vmlinuz-5.13.0-28-generic
9.7M    /boot/vmlinuz-5.13.0-27-generic
9.7M    /boot/vmlinuz-5.13.0-25-generic
8.0M    /boot/grub
5.7M    /boot/System.map-5.13.0-28-generic
5.7M    /boot/System.map-5.13.0-27-generic
5.7M    /boot/System.map-5.13.0-25-generic
5.6M    /boot/System.map-5.11.0-46-generic
252K    /boot/config-5.13.0-28-generic
252K    /boot/config-5.13.0-27-generic
252K    /boot/config-5.13.0-25-generic
252K    /boot/config-5.11.0-46-generic
184K    /boot/memtest86+_multiboot.bin
184K    /boot/memtest86+.elf
180K    /boot/memtest86+.bin
16K /boot/lost+found
4.0K    /boot/efi
0   /boot/vmlinuz.old
0   /boot/vmlinuz
0   /boot/initrd.img.old
0   /boot/initrd.img

인용하다:

  1. 감사해요@terdon, 그는 지적했다 sort -h9.7 MiBvs. 100 KiB와 같이 사람이 읽을 수 있는 크기로 정렬할 수 있습니다.

또한보십시오:

  1. Q&A@Fabien Auréjac이 지적했습니다.:서버 오류: du -h 출력을 크기별로 정렬하는 방법sort -h- 사람이 읽을 수 있는 출력을 정렬 할 수 있습니다.du -h

답변3

du는 -ah 옵션을 제공합니다. 또는 -h 옵션과 함께 df 명령을 사용하여 스크립트에서 해석할 수 있는 공간 사용률 데이터를 얻을 수 있습니다.

정렬하려면 이 serverfault 게시물에 표시된 제안을 사용할 수 있습니다.https://serverfault.com/questions/62411/how-can-i-sort-du-h-output-by-size

du -hs * | sort -h

GNU에서sort 수동:

-h, --human-numeric-sort compare human readable numbers (e.g., 2K 1G)

관련 정보