du와 wc의 차이

3960 단어 LinuxGNUtech

du와 wc


파일 크기를 알고 싶을 때 사용하는 명령으로du와 wc가 있습니다.이런 차이는 무엇입니까?
Ubuntu 18.04LTE에서 GNU Coreutils의 Du와 wc를 통해 확인한다.

du는 4096바이트 단위로 반올림...꼭 그렇지는 않다


du는 보통 4096바이트 단위로 조정된 크기를 되돌려줍니다.
$ echo -n 12345 > xxx
$ du xxx
4	xxx
$ du --block-size=1 xxx
4096	xxx
실현을 확인한 후 fstat(2)에서 얻은stat구조에서 stat.st_blocks * 512의 값을 되돌려줍니다.위의 예는 st입니다.Blocks는 8의 배수다.
coreutils/src/du.c
duinfo_set (&dui,
            (apparent_size
             ? MAX (0, sb->st_size)
             : (uintmax_t) ST_NBLOCKS (*sb) * ST_NBLOCKSIZE), /* HERE */
            (time_type == time_mtime ? get_stat_mtime (sb)
             : time_type == time_atime ? get_stat_atime (sb)
             : get_stat_ctime (sb)));
gnulib/lib/stat-size.h
# define ST_NBLOCKS(statbuf) ((statbuf).st_blocks)
/* ... */
#  define ST_NBLOCKSIZE 512
다른 한편, 추가-b 옵션은 4096바이트 단위로 잘라낸 치수가 아니라 실제 파일 내용을 되돌려주는 치수입니다.
$ echo -n 12345 > xxx
$ du -b xxx
5	xxx
따라서du의 출력은 항상 4096바이트 단위로 전환되지 않는다.
실현이 확인되면 이 상황에서 stat.st_size 의 값을 되돌려줍니다.
coreutils/src/du.c
duinfo_set (&dui,
            (apparent_size
             ? MAX (0, sb->st_size) /* HERE */
             : (uintmax_t) ST_NBLOCKS (*sb) * ST_NBLOCKSIZE),
            (time_type == time_mtime ? get_stat_mtime (sb)
             : time_type == time_atime ? get_stat_atime (sb)
             : get_stat_ctime (sb)));

wc read。。。꼭 그렇지는 않다


wc를 선택적으로 실행하지 않으면 대상의 파일을 읽고 lines,words,bytes를 출력합니다.
$ echo -n 12345 > xxx
$ wc xxx
0 1 5 xxx
$ strace wc xxx 2>&1 >/dev/null
...
openat(AT_FDCWD, "xxx", O_RDONLY)       = 3
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "12345", 16384)                 = 5
read(3, "", 16384)                      = 0
...
words,lines를 얻기 위해서는 파일의 내용을 읽어야 합니다.
https://github.com/coreutils/coreutils/blob/86c8dc2e85c0941ec7908cd5a3db7803e7293606/src/wc.c#L380
한편, wc -c에서bytes만 획득한 경우read를 하지 않고 사이즈를 되돌려주는 동작.
$ wc -c xxx
5 xxx
$ strace wc -c xxx 2>&1 >/dev/null
...
openat(AT_FDCWD, "xxx", O_RDONLY)       = 3
fstat(3, {st_mode=S_IFREG|0664, st_size=5, ...}) = 0
...
fstat(2)에서stat구조를 가져오고 stat.st_size의 값을 되돌려줍니다.
https://github.com/coreutils/coreutils/blob/86c8dc2e85c0941ec7908cd5a3db7803e7293606/src/wc.c#L285

du 파일을 열지 않음


wc는 파일을 열어 크기를 얻지만 du는 파일을 열지 않고 fstatat(2)를 통해 크기를 얻습니다.
따라서 두라면 접근 허가를 읽지 않은 파일의 크기도 얻을 수 있지만 wc라면 오류가 발생할 수 있습니다.
$ echo -n 12345 > xxx
$ chmod -r xxx
$ ls -l xxx
--w--w---- 1 vagrant vagrant 5 Mar 21 22:13 xxx
$ du -b xxx
5	xxx
$ wc -c xxx
wc: xxx: Permission denied

총결산

  • du는 때로는 4096바이트 단위로 조정된 사이즈를 되돌려주지만 때로는 그렇지 않다.
  • wc는 파일을 읽을 때도 있지만 읽지 않을 때도 있습니다.
  • du는 파일을 열지 않습니다.wc 파일을 엽니다.
  • 좋은 웹페이지 즐겨찾기