가능한 시나리오가 있나요
ls -l file.txt
표시되는 바이트 수는 다음과 같습니다.
wc -c file.txt
스크립트에서 이 두 값의 비교를 찾았습니다. 그 이유는 무엇입니까? 동일한 파일의 바이트 수가 다를 수 있습니까?
답변1
예, 그러한 예가 있습니다.
의 경우심볼릭 링크GNU 를 사용하는 Linux 시스템에서는 ls
링크 ls -l
의 크기가 출력되고 wc -c
실제 파일이 구문 분석되어 해당 파일의 바이트 수가 읽혀집니다. 아래에서는 ls -l
29바이트가 보고되는 반면 wc
실제 파일에서는 172바이트가 보고되는 것을 볼 수 있습니다 .
$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 29 1月 17 2016 /etc/resolv.conf -> ../run/resolvconf/resolv.conf
$ wc -c /etc/resolv.conf
172 /etc/resolv.conf
$ wc -c /var/run/resolvconf/resolv.conf
172 /var/run/resolvconf/resolv.conf
$ ls -l /var/run/resolvconf/resolv.conf
-rw-r--r-- 1 root root 172 1月 15 15:49 /var/run/resolvconf/resolv.conf
의 경우가상 파일 시스템,예를 들어/proc
또는 /sys
거기에 있는 많은 파일의 크기가 0인 것으로 나타납니다 ls -l
. 파일 시스템 에는 /dev
캐릭터 장치, 블록 장치 등 다양한 특수 파일이 있습니다. wc -c
이 파일을 매달고 ls -l
표시하세요 .기본 및 보조 번호크기보다는
명명된 파이프0
bytes 로 보고되지만 파이프의 내용은 실제로 읽히므로 기술적으로 명명된 파이프에 얼마나 많은 데이터가 있는지 알려줍니다 ls -c
.wc -c
$ mkfifo named.pipe
$ echo "This is a test" > named.pipe &
[1] 2129
$ ls -l named.pipe
prw-rw-r-- 1 xieerqi xieerqi 0 1月 16 08:40 named.pipe|
$ wc -c named.pipe
15 named.pipe
[1] + Done echo "This is a test" >named.pipe
일반 파일의 경우 크기가 동일해야 합니다.
ls -l
와 의 핵심 포인트 wc -c
와 작동 방식도 다릅니다. 실제로 읽기 위해 파일을 엽니다( wc -c
예를 들어 실행하면 알 수 있듯이). 해당 항목에 대해서만 호출을 수행하세요. 이는 또한 크기가 0으로 표시되는 이유를 설명합니다. 이러한 파일은 "실제"가 아니거나 실제로 하드 드라이브/SSD에 저장되어 있지 않기 때문에 계산할 수 없습니다. 대신 읽어보세요strace wc -c /etc/passwd
ls -l
stat()
/proc
ls -l
wc -c
콘텐츠파일의 크기를 확인하고 크기를 계산합니다.
마지막으로 ls -l
항목을 대화형으로 나열하기 위한 도구입니다. 스크립팅에는 거의 적합하지 않습니다. 실제로 데이터를 읽어야 할 경우 wc -c
대신 사용하십시오.
이는 파일 크기를 스크립팅하고 추정하는 데 가장 적합한 옵션은 아닙니다 ls
. 사실 이게 일반적인 관행인데ls
출력 구문 분석 방지. du -b
파일의 크기를 알아내는 데 사용하십시오 .
답변2
ls -l
파일 시스템에서 보고한 대로 파일 크기를 반환합니다.
wc -c
"실제" 크기를 결정하기 위해 파일을 읽으려고 시도합니다. 제가 관찰해본 바에 따르면 먼저 끝까지 찾아보려고 노력하고, 그래도 안 되면 파일 전체를 읽어서 크기를 계산하는 것 같습니다.
이는 두 도구의 기능을 간단하게 설명하지만 결과에 많은 영향을 미칩니다.
ls
일부 파일 시스템에서는 잘못된 출력이 제공됩니다. 예를 들어, 가상화된 파일 시스템은 /proc
이러한 "파일"이 실제로 소프트웨어의 요청에 따라 생성된 어디에도 저장되지 않기 때문에 많은 파일의 크기가 0이라고 보고합니다.
wc
읽기 권한이 없는 파일에는 전혀 작동하지 않지만 ls
디렉터리 나열에 대한 권한만 작동합니다( ls -l /etc/shadow
와 비교 wc -c /etc/shadow
).
다른 답변에서 언급했듯이 심볼릭 링크도 다르게 동작합니다. 이를 읽으려고 하기 때문에 wc
결국 심볼릭 링크가 가리키는 파일을 읽게 되고, ls
단지 파일 시스템을 쿼리하기 때문에 심볼릭 링크 자체를 저장하는 데 사용된 크기를 보고하게 됩니다.
아직 생각하지 못한 다른 차이점이 있을 거라 생각했는데, 그 근본적인 이유에 대해 명확하고 간단하게 설명드리고 싶습니다.
답변3
일반 파일의 경우 ls 및 wc는 stat를 호출합니다. 그러나 /proc 또는 /sys에 있는 파일의 경우 ls는 0을 반환하지만 wc는 다른 숫자를 반환합니다.
$ ls -l /proc/modules
-r--r--r-- 1 root root 0 Jan 16 14:56 modules
^ this one
$ wc -c /proc/modules
7621 modules
이는 파일이 특별한지 알아내는 방법일 수 있습니다.