“ls -l <random file>”의 바이트 수와“wc -c <random file>”의 바이트 수


25

가능한 상황이 있습니까?

ls -l file.txt

같은 수의 바이트를 표시하지 않습니다

wc -c file.txt

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


2
찾은이 스크립트에 컨텍스트를 줄 수 있습니까?
Kusalananda

답변:


13

예, 그런 경우가 있습니다.

의 경우 심볼릭 링크 GNU 리눅스 시스템 ls의는 ls -l반면, 링크의 크기를 넣어 wc -c실제 파일을 해결하고있다 바이트 수를 읽습니다. 아래 는 실제 파일에서 172 바이트 ls -lwc보고 하는 동안 29 바이트 를 보고 하는 것을 볼 수 있습니다 .

$ 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메이저와 마이너 번호 대신 크기를.

명명 된 파이프0by 로 바이트 로보고 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실제로 읽을 파일을 엽니 다 ( strace wc -c /etc/passwd예를 들어 실행하면 볼 수 있습니다 ). 그들에 ls -l대해서만 stat()전화를 수행합니다 . 이것은 또한 /proc ls -l크기가 0 으로 표시되는 이유를 설명합니다. 파일이 "실제"가 아니거나 실제로 하드 드라이브 / ssd에 저장되어 있지 않기 때문에 해당 파일을 통계 할 수 없습니다. wc -c대신 해당 파일 의 내용 을 읽고 크기를 계산합니다.

마지막으로 ls -l대화식으로 항목을 나열하는 도구 일뿐입니다. 스크립팅에 적합하지 않습니다. 실제로 데이터를 읽어야하는 경우 wc -c대신 사용하십시오.

파일의 스크립팅 및 평가를위한 ls최상의 후보는 아닙니다. 실제로, 이는 구문 분석 ls출력피하는 일반적인 관행 중 하나입니다 . du -b 파일 크기를 찾는 데 사용 하십시오.


1
작은 설명 - 가상 파일 (에서 /sys/, /proc/등) 할 수있다 제공 stat구현 자에 선택하는 경우에, 정보. 대부분의 경우 설득력있는 이유가 없으므로 생략합니다. /proc/kcore주소 지정 가능한 커널 메모리의 크기 (보통 사용 가능한 실제 메모리보다 훨씬 많은 크기)로보고되는 예가 있습니다 .
Toby Speight

11

ls -l 파일 시스템이보고 한 파일의 크기를 반환합니다.

wc -c'실제'크기를 결정하기 위해 파일을 읽으려고 시도합니다. 내 관찰에서 처음에는 끝까지 찾으려고 시도하고 이것이 작동하지 않으면 전체 파일을 읽고 크기를 세어갑니다.

이것은 두 도구의 기능에 대한 간단한 설명이지만 결과에 많은 영향을 미칩니다.

ls특정 파일 시스템에 대해 잘못된 출력을 제공합니다. 예를 들어, 가상화 된 파일 시스템 /proc은 많은 "파일"이 물리적으로 어디에도 저장되지 않기 때문에 많은 파일에 대해 0 크기를보고합니다. 그것들은 소프트웨어에 의해 요구되는대로 생성됩니다.

wc읽기 권한이없는 파일을 전혀하지 기능, 반면 것이다 ls디렉토리 목록 만 권한이 필요합니다 (비교 ls -l /etc/shadowwc -c /etc/shadow).

다른 답변에서 언급했듯이 심볼릭 링크의 동작도 다릅니다. 때문에 wc시도가 그들을 읽고, 그것은 심볼릭 링크 점 때문에 반면되는 파일 읽기 끝 ls단지가 파일 시스템을 조회, 그것은 심볼릭 링크 자체를 저장하는 데 사용되는 크기를보고합니다.

나는 아직 생각하지 않은 다른 차이점이 있다고 확신하지만, 이러한 차이점의 근본 원인에 대해 명확하고 간단한 설명을 해 줄 것이라고 생각했습니다.


읽기 권한을 언급하고 +1 seek(). 이것은 strace wc -l몇 개의 큰 파일을 실행 한 후에 그렇습니다 .
Sergiy Kolodyazhnyy

내 답변보다 훨씬 자세한 내용을 추가 한 +1!
Cyclic3

6

일반 파일의 경우 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

이것은 아마도 무언가가 특별한 파일인지 알아내는 방법입니다.


2
wc -c나를 위해 적어도 호출 fstat하지만 다른 목적으로 보인다. lseek끝까지 ing 하여 파일의 길이를 찾습니다 . 이것이 오류를 반환 read하면 전체 파일입니다.
Muzer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.