"ls -l 바이트 수” 및 “wc -c"

"ls -l 바이트 수” 및 “wc -c"

가능한 시나리오가 있나요

ls -l file.txt

표시되는 바이트 수는 다음과 같습니다.

wc -c file.txt

스크립트에서 이 두 값의 비교를 찾았습니다. 그 이유는 무엇입니까? 동일한 파일의 바이트 수가 다를 수 있습니까?

답변1

예, 그러한 예가 있습니다.

의 경우심볼릭 링크GNU 를 사용하는 Linux 시스템에서는 ls링크 ls -l의 크기가 출력되고 wc -c실제 파일이 구문 분석되어 해당 파일의 바이트 수가 읽혀집니다. 아래에서는 ls -l29바이트가 보고되는 반면 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표시하세요 .기본 및 보조 번호크기보다는

명명된 파이프0bytes 로 보고되지만 파이프의 내용은 실제로 읽히므로 기술적으로 명명된 파이프에 얼마나 많은 데이터가 있는지 알려줍니다 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/passwdls -lstat()/proc ls -lwc -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

이는 파일이 특별한지 알아내는 방법일 수 있습니다.

관련 정보