bash 스크립트에서 파일 크기를 어떻게 얻을 수 있습니까?
이것을 bash 변수에 할당하여 나중에 사용할 수 있습니까?
pv
과 함께이 cat
명령을 사용하십시오.
bash 스크립트에서 파일 크기를 어떻게 얻을 수 있습니까?
이것을 bash 변수에 할당하여 나중에 사용할 수 있습니까?
pv
과 함께이 cat
명령을 사용하십시오.
답변:
GNU 시스템을 사용하는 것이 가장 좋습니다 :
stat --printf="%s" file.any
에서 남자 합계 :
바이트 단위의 전체 크기 % s
bash 스크립트에서 :
#!/bin/bash
FILENAME=/home/heiko/dummy/packages.txt
FILESIZE=$(stat -c%s "$FILENAME")
echo "Size of $FILENAME = $FILESIZE bytes."
참고 : Mac OS X의 터미널에서 통계를 사용하는 방법은 @chbrown의 답변 을 참조하십시오.
stat: illegal option -- c
stat --printf="%s" file.txt
데비안 Jessie에서 아무것도 출력하지 않습니다 ...
stat -f%z myfile.tar
man stat
--printf는 후행 줄 바꿈을 생략합니다. --format
또는 -c
을 사용 하여 출력을 봅니다. stat --printf="%s" file.any | xxd -
stat -c "%s" file.any | xxd -
file_size_kb=`du -k "$filename" | cut -f1`
사용의 문제점 stat
은 그것이 GNU (Linux) 확장자라는 것입니다. du -k
및 cut -f1
POSIX 의해 특정되므로 유닉스 시스템에 이식된다.
예를 들어 Solaris는 bash와 함께 제공되지만와 함께 제공되지는 않습니다 stat
. 따라서 이것은 전적으로 가설이 아닙니다.
ls
출력의 정확한 형식이 지정되지 않았기 때문에 비슷한 문제가 발생하여 출력을 구문 분석 할 수 없습니다. du -h
GNU 확장이기도합니다.
가능한 곳에서 휴대용 구조물을 고수하면 미래에 누군가의 삶을 편하게 할 수 있습니다. 아마 당신의 것.
du
파일의 크기를 지정하지 않고 파일이 사용하는 공간의 크기를 나타내며 미묘하게 다릅니다 (보통 du
파일 크기는 가장 가까운 블록 수로 반올림 된 파일 크기입니다. 일반적으로 512B 또는 1kB 또는 4kB입니다.
--bytes
하거나 -b
사용하지 않고 -k
허용되는 답변이어야합니다.
-h
의 ( "인간") 옵션은du
일반적인 경우에 가장 적합한 답을 생산하는 것입니다 file_size=`du -h "$filename" | cut -f1
, 그것은 K (킬로바이트), M (메가 바이트) 또는 적절한 G (기가 바이트)를 표시한다.
"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")"
wc -c <"$FILENAME"
다른 주름없이 크기를 제공합니다 size=$(wc -c <"$FILENAME")
.
wc -c < file
적어도 OS X에서는 매우 빠른 것 같습니다. -c 만 지정하면 wc에 파일을 통계하려고 시도하는 두뇌가 있다고 생각합니다.
wc -c
는을 사용 fstat
하지만 파일의 마지막 블록을 찾아 마지막 st_blksize
바이트 까지 읽습니다 . 분명히 이 리눅스에있는 파일 때문입니다 /proc
및 /sys
예는 대략적인 통계의 크기가 , 그리고 wc
실제 크기가 아니라 통계보고 크기를보고 싶어한다. wc -c
와 다른 크기를보고하는 것이 이상 wc
하다고 생각하지만 파일이 일반 디스크 파일이고 메모리에 없으면 파일에서 데이터를 읽는 것이 좋습니다. 또는 최악의 니어 라인 테이프 스토리지 ...
printf
여전히 들여 쓰기가 보이는 것처럼 보입니다 ( 예 : printf "Size: $size"
->) size: <4 spaces> 54339
. 반면에 echo
공백은 무시합니다. 일관성을 유지하는 방법이 있습니까?
fstat
. 달리기를 시도 strace wc -c </etc/passwd
하면 그것이 무엇을하고 있는지 알 수 있습니다.
size의 의미에 따라 다릅니다 .
size=$(wc -c < "$file")
파일에서 읽을 수있는 바이트 수를 제공합니다. IOW, 그것은 파일 내용의 크기입니다. 그러나 파일의 내용을 읽습니다 (파일이 일반 파일이거나 대부분의 wc
구현 에서 일반 파일에 대한 심볼릭 링크 인 경우 제외 ). 부작용이있을 수 있습니다. 예를 들어, 명명 된 파이프의 경우, 읽은 내용을 더 이상 다시 읽을 수 없으며 크기가 무한 /dev/zero
하거나 비슷한 항목 /dev/random
의 경우 다소 시간이 걸립니다. 또한 read
파일에 대한 권한 이 필요 하며 파일의 마지막 액세스 타임 스탬프 가 업데이트 될 수 있습니다.
그것은 표준적이고 이식 가능하지만 일부 wc
구현에는 해당 출력에 선행 공백이 포함될 수 있습니다. 그것들을 제거하는 한 가지 방법은 다음을 사용하는 것입니다.
size=$(($(wc -c < "$file")))
또는 빈 산술 식에 대한 오류를 방지하기 위해 dash
또는 yash
때 wc
(파일을 열 수없는 경우 등)에는 출력을 생성하지 :
size=$(($(wc -c < "$file") +0))
ksh93
한 wc
내장 (당신이 그것을 가능하게 제공, 당신은 또한 그것을 호출 할 수 있습니다 command /opt/ast/bin/wc
그 껍질에 정규 파일이 가장 효율적으로 만드는).
다양한 시스템에는 또는 시스템 호출에 stat
대한 인터페이스 인 명령 이 있습니다.stat()
lstat()
그것들은 inode에서 발견 된 정보를보고합니다. 그 정보 중 하나가 st_size
속성입니다. 일반 파일의 경우 이는 컨텐츠의 크기입니다 (오류가없는 상태에서 읽을 수있는 데이터의 양 (대부분의 wc -c
구현이 최적화에 사용하는 것)). 심볼릭 링크의 경우 대상 경로의 크기 (바이트)입니다. 명명 된 파이프의 경우 시스템에 따라 0 또는 현재 파이프 버퍼에있는 바이트 수입니다. 시스템에 따라 0 또는 기본 스토리지의 크기 (바이트)를 얻는 블록 디바이스의 경우에도 동일합니다.
해당 정보를 얻기 위해 파일에 대한 읽기 권한이 필요하지 않으며 연결된 디렉토리에 대한 검색 권한 만 있습니다.
시간 순서에 따라 다음이 있습니다.
IRIXstat
(90 년대) :
stat -qLs -- "$file"
( ) 의 st_size
속성을 반환 하거나$file
lstat()
stat -s -- "$file"
$file
심볼릭 링크 인 경우를 제외하고 는 동일하지만 st_size
심볼릭 링크 분석 후 파일의 파일입니다.
zsh
stat
모듈 zstat
에 내장 (현재로도 알려져 있음 ) (1997) :zsh/stat
zmodload zsh/stat
stat -L +size -- $file # st_size of file
stat +size -- $file # after symlink resolution
또는 변수에 저장 :
stat -L -A size +size -- $file
분명히, 그것은 그 껍질에서 가장 효율적입니다.
GNUstat
(2001); 또한 stat
2005 년부터 BusyBox 에서 (GNU에서 복사 stat
) :
stat -c %s -- "$file" # st_size of file
stat -Lc %s -- "$file" # after symlink resolution
(의 의미는 -L
IRIX 또는와 비교하여 반대 zsh
stat
입니다.
BSDstat
(2002) :
stat -f %z -- "$file" # st_size of file
stat -Lf %z -- "$file" # after symlink resolution
또는 다음 과 같은 일부 스크립팅 언어 의 stat()
/ lstat()
기능을 사용할 수 있습니다 perl
.
perl -le 'print((lstat shift)[7])' -- "$file"
AIX는 또한이 istat
명령은 모든 덤프 stat()
(안 lstat()
예를 들어, 그래서 심볼릭 링크에서 작동하지 않습니다) 정보와 당신이 수 게시 프로세스를 :
LC_ALL=C istat "$file" | awk 'NR == 4 {print $5}'
( 세부 사항을 알아내는 데 도움을 주신 @JeffSchaller에게 감사드립니다 ).
에서 tcsh
:
@ size = -Z $file:q
(Symlink 해상도 후 크기)
GNU가 stat
명령을 소개하기 오래 전에 , 술어 find
와 함께 GNU 명령을 사용 하여 동일한 작업을 수행 할 수있었습니다 -printf
(이미 1991 년).
find -- "$file" -prune -printf '%s\n' # st_size of file
find -L -- "$file" -prune -printf '%s\n' # after symlink resolution
그러나 한 가지 문제는 $file
시작으로 시작 -
하거나 find
술어 (예 : !
, (
...) 인 경우 작동하지 않습니다 .
stat()
/ lstat()
정보 를 얻는 표준 명령 은 ls
입니다.
POSIXly, 당신은 할 수 있습니다 :
LC_ALL=C ls -dn -- "$file" | awk '{print $5; exit}'
-L
심볼릭 링크 해결 후 동일하게 추가하십시오 . 5 번째 필드가 크기 대신 장치 주요 번호 인 장치 파일에는 작동하지 않습니다 .
블록 장치의 경우에 stat()
대해 0을 반환하는 시스템에는 st_size
일반적으로 블록 장치의 크기를보고하는 다른 API가 있습니다. 예를 들어, Linux에는가 있으며 BLKGETSIZE64
ioctl()
대부분의 Linux 배포에는 blockdev
이를 사용할 수 있는 명령이 제공됩니다.
blockdev --getsize64 -- "$device_file"
그러나 해당 장치 파일에 대한 읽기 권한이 필요합니다. 일반적으로 다른 방법으로 크기를 도출 할 수 있습니다. 예를 들어 (여전히 Linux에서) :
lsblk -bdno size -- "$device_file"
빈 장치를 제외하고 작동해야합니다.
검색 가능한 모든 파일 (일반 파일, 대부분의 블록 장치 및 일부 문자 장치 포함)에 적용 되는 접근 방식은 파일을 열고 끝까지 찾는 것입니다.
함께 zsh
합니다 (로딩 후 zsh/system
모듈)
{sysseek -w end 0 && size=$((systell(0)))} < $file
로 ksh93
:
< "$file" <#((size=EOF))
또는
{ size=$(<#((EOF))); } < "$file"
로 perl
:
perl -le 'seek STDIN, 0, 2 or die "seek: $!"; print tell STDIN' < "$file"
명명 된 파이프를 들어, 우리는 일부 시스템 (AIX, 솔라리스, HP는 / UX 적어도)에서 사용할 수있는 파이프 버퍼에있는 데이터의 양을 것을 본 적이 stat()
의 ' st_size
. Linux 나 FreeBSD와 같은 일부는 그렇지 않습니다.
적어도 리눅스 FIONREAD
ioctl()
에서는 파이프를 연 후 after를 사용할 수 있습니다 (읽기 + 쓰기 모드에서 멈추지 않도록).
fuser -s -- "$fifo_file" &&
perl -le 'require "sys/ioctl.ph";
ioctl(STDIN, &FIONREAD, $n) or die$!;
print unpack "L", $n' <> "$fifo_file"
그러나 파이프의 내용을 읽지 는 않지만 여기서 명명 된 파이프를 여는 것만으로도 부작용이 발생할 수 있습니다. 우리는 fuser
일부 프로세스에 이미 파이프가 열려 있는지 확인하기 위해 사용 하고 있지만 fuser
모든 프로세스를 확인할 수는 없기 때문에 절대 아닙니다.
지금까지는 파일과 관련된 기본 데이터 의 크기 만 고려했습니다 . 메타 데이터의 크기와 해당 파일을 저장하는 데 필요한 모든 지원 인프라는 고려하지 않습니다.
에 의해 반환되는 다른 inode 속성 stat()
은 st_blocks
입니다. 파일의 데이터를 저장하는 데 사용되는 512 바이트 블록의 수이며 Linux의 ext4 파일 시스템의 확장 속성과 같은 일부 메타 데이터도 있습니다. 여기에는 inode 자체 또는 파일이 연결된 디렉토리의 항목이 포함되지 않습니다.
크기와 디스크 사용량은 압축, sparseness (일부 메타 데이터), 긴밀하게 관련이있는 것은 아니며 일부 파일 시스템의 간접 블록과 같은 추가 인프라는 후자의 영향을받습니다.
일반적으로 du
디스크 사용량을보고 하는 데 사용됩니다. 위에 나열된 대부분의 명령은 해당 정보를 얻을 수 있습니다.
POSIXLY_CORRECT=1 ls -sd -- "$file" | awk '{print $1; exit}'
POSIXLY_CORRECT=1 du -s -- "$file"
(내 파일의 디스크 사용량을 포함하는 디렉토리에는 해당되지 않음).find -- "$file" -printf '%b\n'
zstat -L +block -- $file
stat -c %b -- "$file"
stat -f %b -- "$file"
perl -le 'print((lstat shift)[12])' -- "$file"
wc -c
는을 사용 fstat
하지만 마지막 st_blksize
바이트 까지 읽습니다 . 분명히 이것은 Linux의 파일 /proc
과 /sys
예를 들어 대략적인 통계 크기를 갖기 때문 입니다. 이것은 정확성에는 좋지만 파일의 끝이 디스크에 있고 메모리에 있지 않은 경우에는 좋지 않습니다 (루프의 많은 파일에서 사용되는 경우). 파일이 니어 라인 테이프 스토리지 또는 FUSE 투명 감압 파일 시스템으로 마이그레이션되는 경우 매우 나쁩니다 .
ls -go file | awk '{print $3}'
-go
는 SysV 였고 BSD (POSIX의 선택적 (XSI))에서는 작동하지 않습니다. 또한 필요할 것 ls -god file | awk '{print $3; exit}'
( -d
이 디렉토리에 작업 할 exit
대상에서 줄 바꿈과 심볼릭 링크의 경우). 장치 파일 문제도 남아 있습니다.
wc -c
바이트 수를보고하는 것은 아닙니다 .
이 스크립트는 여러 가지 방법으로 파일 크기를 계산합니다.
(
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에 더 많은 도움말과 옵션이있는 프로덕션 버전이 있습니다.
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
ls -l filename
파일 크기, 권한 및 소유자를 포함하여 파일에 대한 많은 정보를 제공합니다.
다섯 번째 열의 파일 크기이며 바이트 단위로 표시됩니다. 아래 예제에서 filesize는 2KB 미만입니다.
-rw-r--r-- 1 user owner 1985 2011-07-12 16:48 index.php
편집 : 이것은 분명히 stat
명령 만큼 신뢰할 수 없습니다 .
ls -l
과 stat
명령 모두 신뢰할만한 크기 정보를 제공 한다고 생각합니다 . 나는 그 반대에 대한 언급을 찾지 못했습니다. ls -s
블록 수로 크기를 줄 것입니다.
du filename
디스크 사용량을 바이트 단위로 알려줍니다.
나는 du -h filename
사람이 읽을 수있는 형식으로 크기를 제공 하는을 선호 합니다.
du
단순한 바이트 수가 아닌 1024 바이트 블록으로 크기 를 인쇄합니다.
du
은 512 바이트 단위의 출력을 제공합니다. 환경에서 du
호출하지 않는 한 GNU 는 대신 킬로바이트를 사용 POSIXLY_CORRECT
합니다.
쉘 스크립트에서 위임 할 수있는 작은 유틸리티 함수를 작성하십시오.
예
#! /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의 답변 정보를 기반으로합니다.
gzip -v < file > /dev/null
파일의 압축성을 확인하려면 참조하십시오 .
case
진술 을 사용하고 싶은 전형적인 경우 입니다. case
패턴 일치를 수행하는 Bourne / POSIX 구문입니다. [[...]]
ksh / bash / zsh 만 (변이 포함)입니다.
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에는 통계가 없지만 awk 가 있습니다 .
다른 POSIX 호환 방법은 줄 바꾸기 문자를 제외하고 입력 파일의 각 줄에있는 문자로 길이를 반환하는 함수 awk
와 함께 사용하는 것 length()
입니다. 따라서
awk '{ sum+=length } END { print sum+NR }' file
우리는 확인 NR
에 추가 sum
하여 문자와 파일에서 발생하는 줄 바꿈의 총 수의 총 수의 결과. length()
함수는 awk
디폴트에 의해 인자되는 걸리는 length($0)
현재 전체 라인이다.
printf 'a\nb' | awk '{ sum+=length } END { print sum+NR }'
3을 인쇄해야하지만 4를 인쇄해야합니다.
나는 화장실 옵션을 좋아한다. 'bc'와 함께 사용하면 원하는 곳에서 소수점을 얻을 수 있습니다.
나는 'ls -alh'명령의 'file size'열을 방해하는 스크립트를 개선하려고했습니다. 정수 파일 크기 만 원하지 않았고 소수점 이하 두 자리가 적합 해 보였으 므로이 토론을 읽은 후 아래 코드를 생각해 냈습니다.
스크립트에 포함하면 세미콜론에서 줄을 바꾸는 것이 좋습니다.
file=$1; string=$(wc -c $file); bite=${string% *}; okay=$(echo "scale=2; $bite/1024" | bc);friend=$(echo -e "$file $okay" "kb"); echo -e "$friend"
"스크립트 그림 파일 길이 얻기" 라는 스크립트를 gpfl 이라고 합니다. GUI jpeg 뷰어에서 그림을 열거 나 다시로드하기 전에 imagemagick의 파일에서 mogrify 를 한 후에 사용합니다 .
이 제안이 이미 제공되고 논의 된 내용에서 많은 것을 빌리기 때문에이 답변이 어떻게 "답변"인지 알 수 없습니다. 그래서 거기에 두겠습니다.
BZT
wc
는 stat.st_size
대략적인 경우 (Linux /proc
및 /sys
파일 과 같은 경우) 파일의 마지막 블록을 읽습니다 . 나는 그들이 추가 할 때 메인 댓글이 더 복잡하게하지 않기로 결정 같아요 다운 논리 몇 라인 : lingrok.org/xref/coreutils/src/wc.c#246
가장 빠르고 간단한 (IMO) 방법은 다음과 같습니다.
bash_var=$(stat -c %s /path/to/filename)
du
과 wc
대답 에 대해 불평 할 수 있습니다. 나는 오늘 밤 실제 응용 프로그램에서 내 대답을 사용하고 공유 가치가 있다고 생각했습니다. 나는 우리 모두 의견이 엇갈리게 있다고 생각한다 .