it-gundan.com

bash 스크립트에서 파일 크기를 어떻게 얻을 수 있습니까?

Bash 스크립트에서 파일 크기를 어떻게 얻을 수 있습니까?

이것을 bash 변수에 할당하여 나중에 사용할 수 있습니까?

271
haunted85

GNU 시스템에서 가장 좋은 방법 :

stat --printf="%s" file.any

man stat 에서 :

바이트 단위의 전체 크기 % s

Bash 스크립트에서 :

#!/bin/bash
FILENAME=/home/heiko/dummy/packages.txt
FILESIZE=$(stat -c%s "$FILENAME")
echo "Size of $FILENAME = $FILESIZE bytes."

참고 : Mac OS X의 터미널에서 stat를 사용하는 방법은 @ chbrown 's answer 를 참조하십시오.

262
b01
file_size_kb=`du -k "$filename" | cut -f1`

stat를 사용할 때의 문제점은 그것이 GNU (Linux) 확장자 임)입니다. du -kcut -f1 POSIX에 의해 지정되므로 모든 유닉스 시스템에 이식 가능합니다.

예를 들어, Solaris는 stat가 아닌 bash와 함께 제공됩니다. 따라서 이것은 전적으로 가설이 아닙니다.

ls에는 출력의 정확한 형식이 지정되지 않았기 때문에 비슷한 문제가 있으므로 출력을 구문 분석 할 수 없습니다. du -h도 GNU 확장명입니다.

가능한 곳에서 휴대용 구조물을 고수하면 미래에 누군가의 삶을 편하게 할 수 있습니다. 아마 당신의 것.

97
Nemo

"Word count"명령 (wc)을 사용할 수도 있습니다.

wc -c "$filename" | awk '{print $1}'

wc의 문제점은 파일 이름을 추가하고 출력을 들여 쓰기한다는 것입니다. 예를 들면 다음과 같습니다.

$ wc -c somefile.txt
    1160 somefile.txt

파일 크기를 계산하기 위해 전체 해석 언어 또는 스트림 편집기를 체인으로 묶지 않으려면 파일에서 입력을 리디렉션하여 wc가 파일 이름을 찾지 못하도록하십시오.

wc -c < "$filename"

이 마지막 형식은 명령 대체와 함께 사용하여 아래 Gilles 에서 언급 한 것처럼 셸 변수로 원하는 값을 쉽게 가져올 수 있습니다.

size="$(wc -c <"$filename")"
79
Eugéne

BSD (macOS) stat에는 다른 형식 인수 플래그와 다른 필드 지정자가 있습니다. man stat(1)에서 :

  • -f format : 지정된 형식을 사용하여 정보를 표시합니다. 유효한 형식에 대한 설명은 형식 섹션을 참조하십시오.
  • ... 포맷 섹션 ...
  • z : 바이트 단위의 파일 크기.

이제 모두 함께 :

stat -f%z myfile1.txt

참고 : GNU/Linux 시스템에서 stat 명령을 사용하는 방법은 @ b01 's answer 를 참조하십시오. :)

53
chbrown

이 스크립트는 여러 가지 방법으로 파일 크기를 계산합니다.

(
  du --apparent-size --block-size=1 "$file" 2>/dev/null ||
  gdu --apparent-size --block-size=1 "$file" 2>/dev/null ||
  find "$file" -printf "%s" 2>/dev/null ||
  gfind "$file" -printf "%s" 2>/dev/null ||
  stat --printf="%s" "$file" 2>/dev/null ||
  stat -f%z "$file" 2>/dev/null ||
  wc -c <"$file" 2>/dev/null
) | awk '{print $1}'

이 스크립트는 Linux, BSD, OSX, Solaris, SunOS 등을 포함한 많은 Unix 시스템에서 작동합니다.

파일 크기는 바이트 수를 나타냅니다. 파일 크기는 파일이 일반적인 디스크에서 특수 압축, 특수 스파 스 영역 또는 할당되지 않은 블록 등을 사용하지 않고 사용하는 바이트입니다.

이 스크립트에는 추가 도움말 및 추가 옵션이있는 프로덕션 버전이 있습니다. https://github.com/SixArm/file-size

22

stat 가장 적은 시스템 호출로이를 수행하는 것으로 보입니다.

$ set debian-live-8.2.0-AMD64-xfce-desktop.iso

$ strace stat --format %s $1 | wc
    282    2795   27364

$ strace wc --bytes $1 | wc
    307    3063   29091

$ strace du --bytes $1 | wc
    437    4376   41955

$ strace find $1 -printf %s | wc
    604    6061   64793
9
user150821

ls -l filename은 파일 크기, 권한 및 소유자를 포함하여 파일에 대한 많은 정보를 제공합니다.

다섯 번째 열의 파일 크기이며 바이트 단위로 표시됩니다. 아래 예제에서 filesize는 2KB 미만입니다.

-rw-r--r-- 1 user owner 1985 2011-07-12 16:48 index.php

Edit : 이것은 stat 명령만큼 신뢰할 수 없습니다.

8
Druckles

du filename는 디스크 사용량을 바이트 단위로 알려줍니다.

나는 선호한다 du -h filename, 사람이 읽을 수있는 형식으로 크기를 제공합니다.

5
Teddy

AWK 1 라이너를 발견했으며 버그가 있었지만 수정했습니다. 또한 TeraBytes 이후 PetaBytes에 추가했습니다.

FILE_SIZE=234234 # FILESIZE IN BYTES
FILE_SIZE=$(echo "${FILE_SIZE}" | awk '{ split( "B KB MB GB TB PB" , v ); s=1; while( $1>1024 ){ $1/=1024; s++ } printf "%.2f %s", $1, v[s] }')

stat이 모든 단일 시스템에있는 것은 아니라고 생각하면 거의 항상 AWK 솔루션을 사용할 수 있습니다. 예; Raspberry Pi에는 stat가 없지만 awk가 있습니다.

3
findrbot_admin

위임 할 수있는 셸 스크립트에서 작은 유틸리티 함수를 만듭니다.

#! /bin/sh -
# vim: set ft=sh

# size utility that works on GNU and BSD systems
size(){
    case $(uname) in
        (Darwin | *BSD*)
            stat -Lf %z -- "$1";;
        (*) stat -c %s -- "$1"
    esac
}

for f do
    printf '%s\n' "$f : $(gzip < "$f" | wc -c) bytes (versus $(size "$f") bytes)"
done

@ Stéphane Chazelas의 답변 정보를 기반으로합니다.

3
oligofren

POSIX 호환 방법 중 하나는 줄 바꿈 문자를 제외하고 입력 파일의 각 줄에있는 문자로 길이를 반환하는 length() 함수와 함께 awk를 사용하는 것입니다. 따라서

awk '{ sum+=length } END { print sum+NR }' file

NRsum가 추가되어 파일에서 발생하는 총 문자 수와 줄 바꿈 수가 발생합니다. awklength() 함수는 기본적으로 현재 전체 행에 대한 length($0)을 의미하는 인수를 사용합니다.

0
Inian