Bash를 사용하여 파일 크기를 확인하는 방법은 무엇입니까?


145

0 크기를 확인하는 스크립트가 있지만 대신 파일 크기를 확인하는 더 쉬운 방법이 있어야한다고 생각했습니다. 즉, file.txt일반적으로 100k입니다. 스크립트가 90k 미만 (0 포함) 미만인지 확인하고이 경우 파일이 손상되어 새 사본을 얻는 방법.

내가 현재 사용중인 것 ..

if [ -n file.txt ]
then
 echo "everything is good"
else
 mail -s "file.txt size is zero, please fix. " myemail@gmail.com < /dev/null
 # Grab wget as a fallback 
 wget -c https://www.server.org/file.txt -P /root/tmp --output-document=/root/tmp/file.txt
 mv -f /root/tmp/file.txt /var/www/file.txt
fi

답변:


250

[ -n file.txt ]크기를 확인하지 않고 문자열의 file.txt길이가 0 이 아닌지 확인 하므로 항상 성공합니다.

당신이 말하고 싶은 경우 "크기가 제로가 아닌"다음이 필요합니다 [ -s file.txt ].

파일 크기 wc -c를 얻으려면 크기 (파일 길이)를 바이트 단위로 가져 오는 데 사용할 수 있습니다 .

file=file.txt
minimumsize=90000
actualsize=$(wc -c <"$file")
if [ $actualsize -ge $minimumsize ]; then
    echo size is over $minimumsize bytes
else
    echo size is under $minimumsize bytes
fi

이 경우에는 원하는 것 같습니다.

그러나 참고로, 파일이 사용하는 디스크 공간을 알고 싶다면 du -k킬로바이트 단위로 크기 (사용 된 디스크 공간)를 얻는 데 사용할 수 있습니다 .

file=file.txt
minimumsize=90
actualsize=$(du -k "$file" | cut -f 1)
if [ $actualsize -ge $minimumsize ]; then
    echo size is over $minimumsize kilobytes
else
    echo size is under $minimumsize kilobytes
fi

출력 형식을보다 세밀하게 제어해야하는 경우을 참조하십시오 stat. Linux에서는으로 시작하고 stat -c '%s' file.txtBSD / Mac OS X에서는으로 시작합니다 stat -f '%z' file.txt.


5
du -b "$file" | cut -f 1대신에 stat -c '%s' "$file"? 아니면 stat --printf="%s" "$file"?
mivk December

1
휴대 성이 더 뛰어 나기 때문입니다. BSD와 Linux stat 는 다른 플래그를 가지고 있습니다.
Mikel

1
... | cut -d' ' -f1우분투에서 작동 하도록 수정해야했습니다 .
Mikepote

8
wc -c < "$file"(참고 <)를 사용 하면 | cut ...부품이 필요하지 않습니다 (게시 된대로 OSX에서 작동하지 않음). 최소의 BLOCKSIZE가치 duOSX에있다 512.
mklement0

3
@PetriSirkkala 내 Linux 시스템 wc -c <filename에서도 fstatseek? 참고 fstat파일 디스크립터가 아닌 경로 이름을합니다.
Mikel

24

아무도 stat파일 크기 확인을 언급하지 않았다는 것이 놀랍습니다 . 어떤 방법이 더 낫습니다 : -s파일이 비어 있는지 아닌지를 알아내는 것이 다른 모든 것보다 쉽습니다. 그리고 당신이 크기의 파일 을 찾으 려면 find확실히 갈 길입니다.

나는 또한 duKB로 파일 크기를 얻는 것을 좋아 하지만 바이트의 경우 다음을 사용합니다 stat.

size=$(stat -f%z $filename) # BSD stat

size=$(stat -c%s $filename) # GNU stat?

2
stat좋은 생각이지만 CentOS에서 이것은 나를 위해 일한 것입니다 :size=$(stat -c%s $filename)
Oz Solomon

2
불행히도 GNU와 BSD의 차이점은이 대안이 다소 매력적이지 않다는 것입니다. :(
lapo

1
파일이 드문 경우 stat가 오도 될 수 있습니다. stat에 의해보고 된 블록을 사용하여 사용 된 공간을 계산할 수 있습니다.
Ajith Antony

@AjithAntony 그것은 나에게 일어나지 않은 흥미로운 점입니다. 내가 볼 수 stat있는 권리 그러나 확실히 모든, 어떤 상황에서 건, 스파 스 파일은 대부분의 경우 관련이 없습니다.
Daniel C. Sobral

17

awk 및 이중 괄호가있는 대체 솔루션 :

FILENAME=file.txt
SIZE=$(du -sb $FILENAME | awk '{ print $1 }')

if ((SIZE<90000)) ; then 
    echo "less"; 
else 
    echo "not less"; 
fi

1
훌륭하지만 du지원하지 않는 OSX에서는 작동 하지 않습니다 -b. (의식적인 스타일의 선택이 될 수도 있지만 대안을 언급 할 수도 있습니다 . 변수를 참조 할 때 $접두사를 생략 할 수 있습니다 (( ... )). ((SIZE<90000)))
mklement0

1
사실이 생략 잘못이라고 생각 이전 사용자의 편집했다$
fstab에

2
@fstab, ( 내부 명령) awk을 사용하여 생략 할 수 있습니다 .readbashread SIZE _ <<<$(du -sb "$FILENAME")
Jdamian

13

귀하의 경우 find이 구문 핸들, 당신은 그것을 사용할 수 있습니다 :

find -maxdepth 1 -name "file.txt" -size -90k

file.txt크기 file.txt가 90k 미만인 경우에만 stdout으로 출력 됩니다 . 크기가 90k 미만인 script경우 스크립트를 실행하려면file.txt

find -maxdepth 1 -name "file.txt" -size -90k -exec script \;

3
+1이지만 OSX에서도 작동하게하려면 다음과 같은 명시 적 대상 디렉토리 인수가 필요합니다.find . -maxdepth 1 -name "file.txt" -size -90k
mklement0

8

파일 크기 만 찾는 경우 :

$ cat $file | wc -c
> 203233

1
이것은 가능한 가장 짧은 대답 일 수도 있지만 아마도 가장 느릴 수도 있습니다. :)
SunSparc

2
예, 그러나 확실히 경제적으로 우수합니다 : 엔지니어링 비용> 계산 시간
BananaNeil

8
wc -c "$file"(3 년 전) 2011 년에 답변으로 제공되었습니다. 예, wc -c "$file"문자 수뿐만 아니라 파일 이름을 출력하는 문제가 있으므로 초기 답변에 카운트를 분리하는 명령이 추가되었습니다. 그러나 wc -c < "$file", 어떤 문제가, 당신의 대답은 동등한 5 월 2014 년에 주석으로 추가 된 수정, 그것은 추가를 제외시켰다 "의 쓸모없는 사용을 cat" . 또한 특별한 이유가없는 한 모든 쉘 변수 참조를 인용해야합니다.
G-Man, 'Reinstate

1
cat.if 대신 head -c를 사용하여보다 효율적으로 만들 수 있습니다. [$ (head -c 90000 $ file | wc -c) -lt 90000]; 그런 다음 echo "파일이 90k보다 작습니다"; fi. CentOS에서 테스트되었으므로 BSD 또는 OSX에서 작동하거나 작동하지 않을 수 있습니다.
Kevin Keane

@BananaNeil 20 초 마다이 프로세스를 수행하는 방법으로 파일 크기의 증가를 확인할 수 있습니까?
Sahra

6

이것은 리눅스와 macOS 모두에서 작동합니다.

function filesize
{
    local file=$1
    size=`stat -c%s $file 2>/dev/null` # linux
    if [ $? -eq 0 ]
    then
        echo $size
        return 0
    fi

    eval $(stat -s $file) # macos
    if [ $? -eq 0 ]
    then
        echo $st_size
        return 0
    fi

    return -1
}

5

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

올바르게 이해하면 파이프 리디렉션으로 테스트를 수행해야합니까? :이 strace du --bytes $1 2>&1 >/dev/null | wc 경우 ArchLinux의 amd64 아키텍처 (일반적으로 모든 최신 버전)에 대해 45 줄 du, 46 줄 stat, 47 줄 wc및 에 대한 72 줄 find.
VasiliNovikov

5
python -c 'import os; print (os.path.getsize("... filename ..."))'

휴대용, 파이썬의 모든 맛, 통계 방언의 변형을 피하십시오


4

Linux 및 Mac OS X (및 아마도 다른 BSD)에서 파일 크기를 얻으려면 많은 옵션이 없으며 여기에서 제안하는 옵션은 하나의 시스템에서만 작동합니다.

주어진 f=/path/to/your/file,

Linux와 Mac 의 Bash 모두에서 작동하는 것은 무엇입니까?

size=$( perl -e 'print -s shift' "$f" )

또는

size=$( wc -c "$f" | awk '{print $1}' )

다른 답변은 Linux에서는 잘 작동하지만 Mac에서는 작동하지 않습니다.

  • du-bMac에 옵션 이없고 BLOCKSIZE = 1 트릭이 작동하지 않습니다 ( "최소 블록 크기는 512"이므로 잘못된 결과가 발생 함)

  • cut -d' ' -f1 Mac에서는 숫자가 오른쪽으로 정렬되고 공백이 채워져 있기 때문에 작동하지 않습니다.

당신이 유연한 뭔가를 필요로한다면, 그것은 하나의 perl'의 -s운영자, 또는 wc -c에 파이프 awk '{print $1}'(AWK는 최고의 공백을 무시합니다).

물론 원래의 나머지 질문에 대해서는 -lt(또는 -gt) 연산자를 사용하십시오 .

if [ $size -lt $your_wanted_size ]; then 기타


3
+1; 당신은 당신 만의 크기를 사용할 것입니다 알고있는 경우 산술 컨텍스트 (공백을 선도하는 것은 무시된다), 당신은으로 단순화 할 수 있습니다 size=$(wc -c < "$f")합니다 (주의 <, 이로 인해 wc단지 수를보고). 다시 비교 : 더 "bash-ful" if (( size < your_wanted_size )); then ...(및 [[ $size -lt $your_wanted_size ]])을 잊지 마십시오 .
mklement0

3

gniourf_gniourf의 답변을 바탕으로

find "file.txt" -size -90k

file.txt크기 file.txt가 90K 미만인 경우에만 stdout에 기록 합니다.

"file.txt"찾기 -size -90k -exec 명령 \;

크기가 90K보다 작은 command경우 명령을 실행합니다 file.txt. 나는 이것을 Linux에서 테스트했다. 에서 find(1),

... 명령 줄 인수 (다음 -H, -L-P의 이름으로 촬영 옵션)하는 파일이나 시작하는 첫 번째 인수까지 검사 할 디렉토리 '-', ...

(강조 추가).


1
ls -l $file | awk '{print $6}'

ls 명령이 열 # 6에서 파일 크기를보고한다고 가정


1

내가 사용하는 것이 du'들 --threshold이를 위해. 이 옵션이 모든 버전에서 사용 가능한지 확실하지 du않지만 GNU 버전에서 구현되어 있습니다.

du (1) 매뉴얼 에서 인용 :

-t, --threshold=SIZE
       exclude entries smaller than SIZE if positive, or entries greater
       than SIZE if negative

du --threshold=OP의 사용 사례에 사용 하는 솔루션은 다음과 같습니다 .

THRESHOLD=90k
if [[ -z "$(du --threshold=${THRESHOLD} file.txt)" ]]; then
    mail -s "file.txt size is below ${THRESHOLD}, please fix. " myemail@gmail.com < /dev/null
    mv -f /root/tmp/file.txt /var/www/file.txt
fi

그의 장점, 즉 du와 같이 하나 인간 - 알려진 형식으로 해당 옵션에 대한 인수 받아 들일 수 10K, 10MiB또는 무엇도 당신이 편안한 느낌을 - 당신이 있기 때문에 형식 / 단위 사이의 수동 변환 할 필요가 없습니다 du처리하는.

참고로, 다음 SIZE은 매뉴얼 페이지 에서이 인수 에 대한 설명입니다 .

The SIZE argument is an integer and optional unit (example: 10K is 
10*1024). Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers
of 1000). Binary prefixes can be used, too: KiB=K, MiB=M, and so on.

+1 우수한 옵션. 불행히도 우리 중 일부는 du지원하지 않는 이전 버전으로 붙어 있습니다. 이 --threshold옵션은 2013 년에 릴리스 된 coreutils 8.21에 추가되었습니다 .
Amit Naidu

1

좋아, 당신이 Mac에 있다면, 이렇게하십시오 : stat -f %z "/Users/Example/config.log" 그게 다입니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.