파일이 있고 a
Linux 시스템의 디렉토리에 있는 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
사용 stat
및 awk
:
$ 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