파일의 총 바이트 수

파일의 총 바이트 수

파일이 있고 aLinux 시스템의 디렉토리에 있는 b경우 . 표시 정보 c에 의존하지 않는 방식으로 ls이 3개 파일의 총 바이트 수를 어떻게 얻을 수 있습니까? 내 말은 오류가 덜 발생하는 방식에 관심이 있다는 뜻입니다.

고쳐 쓰다
1) ASCII 파일이 아닌 바이너리 파일에 관심이 있습니다.
2) 작업하려면 GNU Linux 또는 Mac과 같은 휴대용 솔루션이 바람직합니다.

답변1

du-c(전체 인쇄) 및 -b(바이트) 옵션 과 함께 사용됩니다.

$ ls -l
total 12
-rw-r--r-- 1 terdon terdon  6 Sep 29 17:36 a.txt
-rw-r--r-- 1 terdon terdon 12 Sep 29 17:38 b.txt
-rw-r--r-- 1 terdon terdon 17 Sep 29 17:38 c.txt

이제 다음을 실행하세요 du.

$ du -bc a.txt b.txt c.txt
6   a.txt
12  b.txt
17  c.txt
35  total

변수의 전체 크기를 원하는 경우:

$ var=$( du -bc a.txt b.txt c.txt | tail -n1 | cut -f1)
$ echo $var
35

답변2

사용 statawk:

$ stat --printf '%s\n' some individual files here | awk '{ s += $1 } END { print s }'

stat주어진 --printf형식을 사용하여 주어진 파일의 파일 크기를 출력합니다(Linux에서). 그런 다음 코드는 awk이를 요약하고 총계를 보고합니다.

macOS의 경우:

$ stat -f '%z' some individual files here | awk '{ s += $1 } END { print s }'

stat유틸리티는 이식 가능하지 않지만 이식 가능한 쉘 스크립트(또는 쉘 함수)로 래핑할 수 있습니다.

#!/bin/sh

case $(uname) in
    Linux)       stat --printf '%s\n' "$@" ;;
    Darwin|*BSD) stat -f '%z' "$@" ;;
    *) echo 'Unknown system. I do not know how stat works here' >&2
       exit 1 ;;
esac | awk '{ s += $1 } END { print s }'

이것은 불릴 것이다

$ ./script a b c

여기서 a, b및 는 c추가하려는 크기(바이트)의 파일입니다.

stat또 다른 해결책은 Linux에서와 동일한 구현에 액세스하기 위해 macOS 시스템에 GNU coreutils를 설치하는 것입니다 .


Linux에서는 다음을 수행할 수도 있습니다.

$ du -bcl some individual files here | awk 'END { print $1 }'

-b그러나 GNU coreutils가 설치되어 있지 않으면 macOS 또는 BSD 시스템에는 이에 상응하는 것이 없습니다(이 플래그는 구현되지 않음).

답변3

GNU를 사용하면 find다음을 수행할 수 있습니다.

find a.txt b.txt c.txt -prune -printf '%s\n' | paste -sd + - | bc

ls -l이는 시스템 호출 보고서의 크기를 제공합니다 stat(). 비전통적인 파일 유형(예: FIFO, 장치, 심볼릭 링크)의 경우 시스템에 따라 해당 파일에서 읽은 바이트 수가 반드시 제공되지 않을 수도 있습니다(있는 경우). 바라보다거기더 많은 선택을 위해.

다음을 수행할 수 있습니다.

cat a.txt b.txt c.txt | wc -c

이를 위해 fifo나 /dev/zero또는 /dev/random.

기호 링크를 확인하고 대상의 크기를 가져오는 -L옵션을 명령에 추가 할 수 있습니다 .find

lstat()불행하게도 POSIXly에서 시스템 호출에 의해 반환된 파일 크기를 얻을 수 있는 유일한 명령은 ls.

ls -l블록 장치의 크기를 반환하지 않습니다. 출력을 안정적으로 구문 분석하는 것은 매우 어려우며 완벽한 방법으로 한 번에 하나의 파일만 수행할 수 있습니다(호환 구현 및 비장치 파일의 경우).

getsize() {
  LC_ALL=C ls -nd -- "$1" | awk '
   {
     if (/^[cb]/) print 0
     else print $5
     exit
   }
   END {exit (!NR)}'
}

(이는 장치 파일의 크기가 0이라고 가정합니다. 이는 Linux에서는 항상 해당되지만 모든 시스템에서는 그렇지 않습니다.)

그러면 다음과 같이 할 수 있습니다:

sum=0
for file in a b c; do
  sum=$((sum + $(getsize "$file")))
done
echo "$sum"

답변4

모든 파일은 연결되어 wc바이트를 계산하는 데 사용됩니다.

cat a.txt b.txt c.txt | wc -c

매우 큰 파일을 읽어야 하기 때문에 속도가 느려집니다. 메타데이터에서 바이트 수를 가져와 합산하는 stat및 같은 명령을 사용하는 솔루션이 더 빠를 것입니다.find

관련 정보