development

ls를 사용하여 디렉토리 및 전체 크기 나열

big-blog 2020. 9. 29. 08:07
반응형

ls를 사용하여 디렉토리 및 전체 크기 나열


ls유닉스에서 하위 디렉토리의 전체 크기와 모든 내용을 나열하는 것이 가능 합니까? IE

total 12K
drwxrwxr-x  6 *** *** 4.0K 2009-06-19 10:10 branches
drwxrwxr-x 13 *** *** 4.0K 2009-06-19 10:52 tags
drwxrwxr-x 16 *** *** 4.0K 2009-06-19 10:02 trunk

맨 페이지를 샅샅이 뒤져서 비어 있습니다.


다음과 같이 시도하십시오.

du -sh *

짧은 버전 :

du --summarize --human-readable *

설명:

du: D ISK U 세이지

-s: 지정된 각 파일에 대한 요약을 표시합니다. (에 해당 -d 0)

-h: "인간이 읽을 수있는"출력. 이용 유닛 접미사 : B의 YTE, K의 ibibyte (킬로바이트), M의 ebibyte MIB (), G의 ibibyte (GIB), T의 ebibyte (TiB 크기) 및 P의 ebibyte (PIB). (BASE2)


du -sk * | sort -n크기별로 폴더를 정렬합니다. 공간을 비울 때 유용합니다 ..


du -sh * | sort -h

사람이 읽을 수있는 형식으로 표시됩니다.


사람이 읽을 수있는 형식으로 현재 디렉토리에서 가장 큰 디렉토리를 나열하려면 다음을 수행하십시오.

du -sh * | sort -hr

행 수를 제한하는 더 좋은 방법은 다음과 같습니다.

du -sh * | sort -hr | head -n10

-n나열된 행 수를 제한하기 위해 플래그 접미사를 늘릴 수있는 위치

견본:

[~]$ du -sh * | sort -hr
48M app
11M lib
6.7M    Vendor
1.1M    composer.phar
488K    phpcs.phar
488K    phpcbf.phar
72K doc
16K nbproject
8.0K    composer.lock
4.0K    README.md

읽기가 더 편리합니다. :)


ls -lh형식으로 표시하려면 다음을 사용하십시오.

(du -sh ./*; ls -lh --color=no) | awk '{ if($1 == "total") {X = 1} else if (!X) {SIZES[$2] = $1} else { sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); print $0} }'

Awk 코드 설명 :

if($1 == "total") { // Set X when start of ls is detected
  X = 1 
} else if (!X) { // Until X is set, collect the sizes from `du`
  SIZES[$2] = $1
} else {
  // Replace the size on current current line (with alignment)
  sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); 
  print $0
}

샘플 출력 :

drwxr-xr-x 2 root     root 4.0K    Feb 12 16:43 cgi-bin
drwxrws--- 6 root     www  20M     Feb 18 11:07 document_root
drwxr-xr-x 3 root     root 1.3M    Feb 18 00:18 icons
drwxrwsr-x 2 localusr www  8.0K    Dec 27 01:23 passwd

원하는 명령은 'du -sk'du = "disk usage"입니다.

-k 플래그는 디스크 섹터의 ​​du 기본값 (512 바이트 블록)이 아닌 킬로바이트 단위로 출력을 제공합니다.

-s 플래그는 최상위 디렉토리 (즉, 기본적으로 현재 디렉토리 또는 명령 행에 지정된 디렉토리)에있는 항목 만 나열합니다. du가 이와 관련하여 ls의 반대 동작을 갖는 것은 이상합니다. 기본적으로 du는 각 하위 디렉토리의 디스크 사용량을 반복적으로 제공합니다. 반대로 ls는 지정된 디렉토리의 목록 파일 만 제공합니다. (ls -R은 재귀 적 동작을 제공합니다.)


이 쉘 함수 선언을 쉘 초기화 스크립트에 넣으십시오.

function duls {
    paste <( du -hs -- "$@" | cut -f1 ) <( ls -ld -- "$@" )
}

(순서대로) duls모두의 출력을 표시하기 때문에 호출했습니다 .duls

$ duls
210M    drwxr-xr-x  21 kk  staff  714 Jun 15 09:32 .

$ duls *
 36K    -rw-r--r--   1 kk  staff    35147 Jun  9 16:03 COPYING
8.0K    -rw-r--r--   1 kk  staff     6962 Jun  9 16:03 INSTALL
 28K    -rw-r--r--   1 kk  staff    24816 Jun 10 13:26 Makefile
4.0K    -rw-r--r--   1 kk  staff       75 Jun  9 16:03 Makefile.am
 24K    -rw-r--r--   1 kk  staff    24473 Jun 10 13:26 Makefile.in
4.0K    -rw-r--r--   1 kk  staff     1689 Jun  9 16:03 README
120K    -rw-r--r--   1 kk  staff   121585 Jun 10 13:26 aclocal.m4
684K    drwxr-xr-x   7 kk  staff      238 Jun 10 13:26 autom4te.cache
128K    drwxr-xr-x   8 kk  staff      272 Jun  9 16:03 build
 60K    -rw-r--r--   1 kk  staff    60083 Jun 10 13:26 config.log
 36K    -rwxr-xr-x   1 kk  staff    34716 Jun 10 13:26 config.status
264K    -rwxr-xr-x   1 kk  staff   266637 Jun 10 13:26 configure
8.0K    -rw-r--r--   1 kk  staff     4280 Jun 10 13:25 configure.ac
7.0M    drwxr-xr-x   8 kk  staff      272 Jun 10 13:26 doc
2.3M    drwxr-xr-x  28 kk  staff      952 Jun 10 13:26 examples
6.2M    -rw-r--r--   1 kk  staff  6505797 Jun 15 09:32 mrbayes-3.2.7-dev.tar.gz
 11M    drwxr-xr-x  42 kk  staff     1428 Jun 10 13:26 src

$ duls doc
7.0M    drwxr-xr-x  8 kk  staff  272 Jun 10 13:26 doc

$ duls [bM]*
 28K    -rw-r--r--  1 kk  staff  24816 Jun 10 13:26 Makefile
4.0K    -rw-r--r--  1 kk  staff     75 Jun  9 16:03 Makefile.am
 24K    -rw-r--r--  1 kk  staff  24473 Jun 10 13:26 Makefile.in
128K    drwxr-xr-x  8 kk  staff    272 Jun  9 16:03 build

설명:

paste유틸리티는 당신이 그것을 제공하는 사양에 따라 입력에서 열을 만듭니다. 두 개의 입력 파일이 주어지면 탭을 구분 기호로 사용하여 나란히 배치합니다.

우리는 그것의 출력을 줄 du -hs -- "$@" | cut -f1첫 번째 파일 (정말 입력 스트림)과의 출력으로 ls -ld -- "$@"두 번째 파일로 저장됩니다.

함수에서는 "$@"각각 큰 따옴표로 묶인 모든 명령 줄 인수 목록으로 평가됩니다. 따라서 공백 등이 포함 된 글 로빙 문자와 경로 이름을 이해할 수 있습니다.

이중 빼기 ( --)는 명령 줄 옵션의 끝을 du및에 나타 ls냅니다. 이러한없이 말을 duls -l혼동 할 du과에 대한 모든 옵션 duls혼동 것없는 ls(두 유틸리티에 존재하며 옵션은 동일한 것을 의미하지 않을 수 있습니다, 그것은 꽤 엉망이 될 것입니다).

cut이후 du단순히의 첫 번째 열에 잘라내 du -hs출력 (크기)를.

du출력을 왼쪽에 배치하기로 결정했습니다 . 그렇지 않으면 흔들리는 오른쪽 열을 관리해야했을 것입니다 (파일 이름 길이가 다양하기 때문).

이 명령은 명령 줄 플래그를 허용하지 않습니다.

이것은 bash및에서 테스트되었습니다 ksh93. 에서는 작동하지 않습니다 /bin/sh.


나는 항상 du -sk( -k킬로바이트 단위로 파일 크기를 표시하는 플래그)를 대신 사용합니다.


du -h --max-depth=1 . | sort -n -r

du -sch * 같은 디렉토리에 있습니다.


이것은 내가 좋아하는 것입니다

업데이트 : 이전 디렉토리는 현재 디렉토리에 파일을 표시하지 않고 디렉토리 만 나열했기 때문에 마음에 들지 않았습니다.

/var우분투의 출력 예 :

sudo du -hDaxd1 /var | sort -h | tail -n10

4.0K    /var/lock
4.0K    /var/run
4.0K    /var/www
12K     /var/spool
3.7M    /var/backups
33M     /var/log
45M     /var/webmin
231M    /var/cache
1.4G    /var/lib
1.7G    /var

ncdu ncurses du

이 멋진 CLI 유틸리티를 사용하면 대화식으로 큰 파일과 디렉토리를 쉽게 찾을 수 있습니다.

예를 들어 잘 알려진 프로젝트 의 트리 내부에서 다음을 수행합니다.

sudo apt-get install ncdu
ncdu

그 결과 :

여기에 이미지 설명 입력

그런 다음 키보드에서 오른쪽 아래로 들어가 /drivers폴더 로 이동하면 다음이 표시됩니다.

여기에 이미지 설명 입력

ncdu 전체 트리에 대해 시작할 때 한 번만 파일 크기를 재귀 적으로 계산하므로 효율적입니다.

"총 디스크 사용량"대 "명백한 크기"는 du에서와 유사합니다 . 여기서 설명했습니다. 'du'의 출력이 종종 'du -b'와 다른 이유

프로젝트 홈페이지 : https://dev.yorhel.nl/ncdu

관련 질문 :

Ubuntu 16.04에서 테스트되었습니다.

ncdu 비대화 형 사용

의 또 다른 멋진 기능은 ncdu먼저 크기를 JSON 형식으로 덤프 한 다음 나중에 다시 사용할 수 있다는 것입니다.

예를 들어, 파일을 생성하려면 다음을 실행하십시오.

ncdu -o ncdu.json

그런 다음 다음을 사용하여 대화식으로 검사합니다.

ncdu -f ncdu.json

NFS와 같이 매우 크고 느린 파일 시스템을 다루는 경우 매우 유용합니다.

이렇게하면 먼저 한 번만 내보낼 수 있으며 몇 시간이 걸릴 수 있으며 파일을 탐색하고 종료하고 다시 탐색하는 등의 작업을 수행 할 수 있습니다.

출력 형식은 JSON이므로 다른 프로그램에서도 쉽게 재사용 할 수 있습니다. 예 :

ncdu -o -  | python -m json.tool | less

간단한 디렉토리 트리 데이터 구조를 보여줍니다.

[
    1,
    0,
    {
        "progname": "ncdu",
        "progver": "1.12",
        "timestamp": 1562151680
    },
    [
        {
            "asize": 4096,
            "dev": 2065,
            "dsize": 4096,
            "ino": 9838037,
            "name": "/work/linux-kernel-module-cheat/submodules/linux"
        },
        {
            "asize": 1513,
            "dsize": 4096,
            "ino": 9856660,
            "name": "Kbuild"
        },
        [
            {
                "asize": 4096,
                "dsize": 4096,
                "ino": 10101519,
                "name": "net"
            },
            [
                {
                    "asize": 4096,
                    "dsize": 4096,
                    "ino": 11417591,
                    "name": "l2tp"
                },
                {
                    "asize": 48173,
                    "dsize": 49152,
                    "ino": 11418744,
                    "name": "l2tp_core.c"
                },

Ubuntu 18.04에서 테스트되었습니다.


look at du command for that


These are all great suggestions, but the one I use is:

du -ksh * | sort -n -r

-ksh makes sure the files and folders are listed in a human-readable format and in megabytes, kilobytes, etc. Then you sort them numerically and reverse the sort so it puts the bigger ones first.

The only downside to this command is that the computer does not know that Gigabyte is bigger than Megabyte so it will only sort by numbers and you will often find listings like this:

120K
12M
4G

Just be careful to look at the unit.

This command also works on the Mac (whereas sort -h does not for example).


du -S

du have another useful option: -S, --separate-dirs telling du not include size of subdirectories - handy on some occasions.

Example 1 - shows only the file sizes in a directory:

du -Sh  * 
3,1G    10/CR2
280M    10

Example 2 - shows the file sizes and subdirectories in directory:

du -h  * 
3,1G    10/CR2 
3,4G    10

du -sm * | sort -nr

Output by size


just a warning, if you want to compare sizes of files. du produces different results depending on file system, block size, ... .

It may happen that the size of the files is different, e.g. comparing the same directory on your local hard-disk and a USB mass storage device. I use the following script, including ls to sum up the directory size. The result in in bytes taking all sub directories into account.

echo "[GetFileSize.sh] target directory: \"$1\""

iRetValue=0

uiLength=$(expr length "$1")
if [ $uiLength -lt 2 ]; then
  echo "[GetFileSize.sh] invalid target directory: \"$1\" - exiting!"
  iRetValue=-1
else
  echo "[GetFileSize.sh] computing size of files..."

  # use ls to compute total size of all files - skip directories as they may
  # show different sizes, depending on block size of target disk / file system
  uiTotalSize=$(ls -l -R $1 | grep -v ^d | awk '{total+=$5;} END {print total;}')
  uiLength=$(expr length "$uiTotalSize")
  if [ $uiLength -lt 1 ]; then
    uiTotalSize=0
  fi
  echo -e "[GetFileSize.sh] total target file size: \"$uiTotalSize\""

fi

exit "$iRetValue"

To display current directory's files and subdirectories sizes recursively:

du -h .

To display the same size information but without printing their sub directories recursively (which can be a huge list), just use the --max-depth option:

du -h --max-depth=1 .

For a while, I used Nautilus (on Gnome desktop on RHEL 6.0) to delete files on my home folder instead of using the rm command in bash. As a result, the total size shown by

du -sh

did not match the sum of disk usage of each sub-directory, when I used

du -sh *

It took me a while to realise Nautilus sends the deleted files to its Trash folder, and that folder is not listed in du -sh * command. So, just wanted to share this, in case somebody faced the same problem.


Hmm, best way is to use this command:

du -h -x / | sort -hr >> /home/log_size.txt

Then you will be able to get all sizes folders over all your server. Easy to help to you to find the biggest sizes.


I ran into an issue similar to what Martin Wilde described, in my case comparing the same directory on two different servers after mirroring with rsync.

Instead of using a script I added the -b flag to the du which counts the size in bytes and as far as I can determine eliminated the differences on the two servers. You still can use -s -h to get a comprehensible output.


The following is easy to remember

ls -ltrapR

list directory contents

-l use a long listing format

-t sort by modification time, newest first

-r, --reverse reverse order while sorting

-a, --all do not ignore entries starting with .

-p, --indicator-style=slash append / indicator to directories

-R, --recursive list subdirectories recursively

https://explainshell.com/explain?cmd=ls+-ltrapR


place in init script like .bashrc ... adjust def as needed.

duh() {
  # shows disk utilization for a path and depth level
  path="${1:-$PWD}"
  level="${2:-0}"
  du "$path" -h --max-depth="$level"
}

If you want more control over the size that you want to list the directories over, you can use the threshold (-t) switch as in:

$ du -ht 1000000000 | sort --reverse

du- dISK의 u세이지
h- 인간이 읽을 수있는 형식
t- 임계 값 크기

여기에서 크기가 1GB보다 큰 모든 디렉토리를 나열하려고합니다.

$ du -ht 1G | sort --reverse

설명 :

위키설명 된 단위는 다음과 같습니다.

K, M, G, T, P, E, Z, Y (1024의 거듭 제곱) 또는
KB, MB, GB, TB, PB, EB, ZB, YB (1000의 거듭 제곱).


"ls -ltrh / path_to_directory"를 입력합니다.

참고 URL : https://stackoverflow.com/questions/1019116/using-ls-to-list-directories-and-their-total-sizes

반응형