쉘에서 파일 크기 (바이트)를 얻는 휴대용 방법?
Linux에서는을 사용 stat --format="%s" FILE하지만 Solaris에 액세스하려면 stat 명령이 없습니다. 그러면 무엇을 사용해야합니까?
Bash 스크립트를 작성 중이며 실제로 시스템에 새 소프트웨어를 설치할 수 없습니다.
나는 이미 다음을 사용하는 것을 고려했다.
perl -e '@x=stat(shift);print $x[7]' FILE
또는:
ls -nl FILE | awk '{print $5}'
그러나 파일 크기를 얻기 위해 Perl을 실행하는 것이 합리적으로 보이지 않습니까? 아니면 두 가지 명령을 실행하여 동일한 작업을 수행합니까?
wc -c < filename(워드 수의 줄임말 -c, 바이트 수를 인쇄 함) 휴대용 POSIX 솔루션입니다. 일부 공간이 앞에 추가 될 수 있으므로 플랫폼에서 출력 형식 만 균일하지 않을 수 있습니다 (Solaris의 경우).
입력 리디렉션을 생략하지 마십시오. 파일이 인수로 전달되면 바이트 이름 뒤에 파일 이름이 인쇄됩니다.
바이너리 파일에서는 작동하지 않을까 걱정했지만 Linux와 Solaris 모두에서 정상적으로 작동합니다. 당신은 그것을 시도 할 수 있습니다 wc -c < /usr/bin/wc. 또한 POSIX 유틸리티는 달리 명시 적으로 지정하지 않는 한 이진 파일을 처리 합니다.
크기를 표시하기 위해 자체 프로그램 (실제로 작음)을 작성했습니다. 자세한 내용은 여기 : http://fwhacking.blogspot.com/2011/03/bfsize-print-file-size-in-bytes-and.html
일반적인 Linux 도구에 대한 가장 확실한 두 가지 방법은 다음과 같습니다.
$ stat -c %s /usr/bin/stat
50000
$ wc -c < /usr/bin/wc
36912
그러나 매개 변수를 입력하거나 파일 크기를 얻기 위해 출력을 파이프하고 싶지 않으므로 내 자신의 bfsize를 사용하고 있습니다.
du일반적으로 실제 데이터 크기가 아닌 디스크 사용량을 인쇄 하더라도 GNU coreutils du는 파일의 "겉보기 크기"를 바이트 단위로 인쇄 할 수 있습니다.
du -b FILE
그러나 BSD, Solaris, macOS에서는 작동하지 않습니다 ...
마지막으로 ls와 bash 배열 확장을 사용하기로 결정했습니다.
TEMP=( $( ls -ln FILE ) )
SIZE=${TEMP[4]}
정말 좋지는 않지만 적어도 1 포크 + 실행 만하고 보조 프로그래밍 언어 (perl / ruby / python / whatever)에 의존하지 않습니다
크로스 플랫폼 가장 빠른 솔루션 ( ls에 단일 fork () 만 사용 , 실제 문자 수를 계산하지 않고 불필요한 awk, perl 등을 생성하지 않음)
MacOS, Linux에서 테스트되었습니다. Solaris를 약간 수정해야 할 수도 있습니다.
__ln=( $( ls -Lon "$1" ) )
__size=${__ln[3]}
echo "Size is: $__size bytes"
필요한 경우 ls 인수를 단순화 하고 $ {__ ln [3]}에서 오프셋을 조정하십시오.
참고 : 심볼릭 링크를 따릅니다.
BSD에는 statGNU coreutils와는 다른 옵션이 있지만 비슷한 기능이 있습니다.
stat -f %z <file name>
이것은 macOS (10.12에서 테스트 됨), FreeBSD , NetBSD 및 OpenBSD에서 작동 합니다.
findGNU fileutils에서 사용 하는 경우 :
size=$( find . -maxdepth 1 -type f -name filename -printf '%s' )
불행하게도, 다른 구현 find일반적으로는 지원하지 않습니다 -maxdepth,도 아니다 -printf. 예를 들어 Solaris 및 macOS의 경우입니다 find.
ls -n이식성이 떨어지는 쉘 배열에 대한 대안으로 출력을 처리 할 때 , 유일한 배열을 형성하고 표준 쉘에서 유일한 로컬 변수 인 위치 인수를 사용할 수 있습니다. 원래 인수를 스크립트 나 함수에 유지하려면 함수에서 위치 인수를 덮어 씁니다.
getsize() { set -- $(ls -dn "$1") && echo $5; }
getsize FILE
ln -dn현재 IFS환경 변수 설정 에 따라 출력을 분할하여 위치 인수에 할당하고 다섯 번째 설정을 에코합니다. -d보장하지만 디렉토리가 제대로 처리되고, -n사용자 및 그룹 이름이 필요하지 않은 것을 보장이와 달리, 해결 될 -l. 또한 공백을 포함하는 사용자 및 그룹 이름은 이론적으로 예상되는 줄 구조를 손상시킬 수 있습니다. 그들은 일반적으로 허용되지 않지만,이 가능성은 여전히 프로그래머를 멈추고 생각하게합니다.
find명령을 사용 하여 일부 파일 세트를 가져올 수 있습니다 (여기서 임시 파일은 추출 됨). 그런 다음 ducommand를 사용하여 -hswitch를 사용하여 사람이 읽을 수있는 형태로 각 파일의 파일 크기를 가져올 수 있습니다 .
find $HOME -type f -name "*~" -exec du -h {} \;
산출:
4.0K /home/turing/Desktop/JavaExmp/TwoButtons.java~
4.0K /home/turing/Desktop/JavaExmp/MyDrawPanel.java~
4.0K /home/turing/Desktop/JavaExmp/Instream.java~
4.0K /home/turing/Desktop/JavaExmp/RandomDemo.java~
4.0K /home/turing/Desktop/JavaExmp/Buff.java~
4.0K /home/turing/Desktop/JavaExmp/SimpleGui2.java~
첫 번째 Perl 예제는 나에게 비합리적으로 보이지 않습니다.
It's for reasons like this that I migrated from writing shell scripts (in bash/sh etc.) to writing all but the most trivial scripts in Perl. I found that I was having to launch Perl for particular requirements, and as I did that more and more, I realised that writing the scripts in Perl was probably a more powerful (in terms of the language and the wide array of libraries available via CPAN) and more efficient way to achieve what I wanted.
Note that other shell-scripting languages (e.g. python/ruby) will no doubt have similar facilities, and you may want to evaluate these for your purposes. I only discuss Perl since that's the language I use and am familiar with.
Solaris에 Perl이 있으면이를 사용하십시오. 그렇지 않으면 통계가 없거나 찾기가 GNU 찾기가 아니기 때문에 lwk가있는 ls가 다음으로 가장 좋습니다.
Solaris에서 사용한 트릭이 있습니다. 둘 이상의 파일 크기를 요청하면 이름이없는 총 크기 만 반환하므로 두 번째 파일로 / dev / null과 같은 빈 파일을 포함하십시오.
예를 들어 명령 파일을 / dev / null
ls / wc / etc에 어떤 크기 명령이 작동하는지 기억할 수 없습니다. 불행히도 테스트 할 solaris 상자가 없습니다.
리눅스에서 사용할 수 있습니다 du -h $FILE. 솔라리스에서도 작동합니까?
당신은 du -ks를 시도 했습니까 | awk '{print $ 1 * 1024}'. 그것은 효과가있을 수 있습니다.
참고 URL : https://stackoverflow.com/questions/1815329/portable-way-to-get-file-size-in-bytes-in-shell
'IT박스' 카테고리의 다른 글
| 특정 파이썬 버전에 대해 pip를 사용하여 모듈 설치 (0) | 2020.08.03 |
|---|---|
| 기본적으로 HTML 선택 비활성화 옵션을 표시하는 방법은 무엇입니까? (0) | 2020.08.03 |
| 콘솔 대신 Visual Studio에서 콘솔 응용 프로그램의 출력 (0) | 2020.08.02 |
| 비 블로킹 I / O가 멀티 스레드 차단 I / O보다 실제로 빠릅니까? (0) | 2020.08.02 |
| SASS.js가 있습니까? (0) | 2020.08.02 |