가능한 상황이 있습니까?
ls -l file.txt
같은 수의 바이트를 표시하지 않습니다
wc -c file.txt
한 스크립트에서 그 두 값의 비교를 발견했습니다. 그 이유는 무엇입니까? 동일한 파일의 다른 바이트 수를 가질 수도 있습니까?
가능한 상황이 있습니까?
ls -l file.txt
같은 수의 바이트를 표시하지 않습니다
wc -c file.txt
한 스크립트에서 그 두 값의 비교를 발견했습니다. 그 이유는 무엇입니까? 동일한 파일의 다른 바이트 수를 가질 수도 있습니까?
답변:
예, 그런 경우가 있습니다.
의 경우 심볼릭 링크 GNU 리눅스 시스템 ls
의는 ls -l
반면, 링크의 크기를 넣어 wc -c
실제 파일을 해결하고있다 바이트 수를 읽습니다. 아래 는 실제 파일에서 172 바이트 ls -l
를 wc
보고 하는 동안 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
쇼 메이저와 마이너 번호 대신 크기를.
명명 된 파이프 는 0
by 로 바이트 로보고 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
파일 크기를 찾는 데 사용 하십시오.
/sys/
, /proc/
등) 할 수있다 제공 stat
구현 자에 선택하는 경우에, 정보. 대부분의 경우 설득력있는 이유가 없으므로 생략합니다. /proc/kcore
주소 지정 가능한 커널 메모리의 크기 (보통 사용 가능한 실제 메모리보다 훨씬 많은 크기)로보고되는 예가 있습니다 .
ls -l
파일 시스템이보고 한 파일의 크기를 반환합니다.
wc -c
'실제'크기를 결정하기 위해 파일을 읽으려고 시도합니다. 내 관찰에서 처음에는 끝까지 찾으려고 시도하고 이것이 작동하지 않으면 전체 파일을 읽고 크기를 세어갑니다.
이것은 두 도구의 기능에 대한 간단한 설명이지만 결과에 많은 영향을 미칩니다.
ls
특정 파일 시스템에 대해 잘못된 출력을 제공합니다. 예를 들어, 가상화 된 파일 시스템 /proc
은 많은 "파일"이 물리적으로 어디에도 저장되지 않기 때문에 많은 파일에 대해 0 크기를보고합니다. 그것들은 소프트웨어에 의해 요구되는대로 생성됩니다.
wc
읽기 권한이없는 파일을 전혀하지 기능, 반면 것이다 ls
디렉토리 목록 만 권한이 필요합니다 (비교 ls -l /etc/shadow
에 wc -c /etc/shadow
).
다른 답변에서 언급했듯이 심볼릭 링크의 동작도 다릅니다. 때문에 wc
시도가 그들을 읽고, 그것은 심볼릭 링크 점 때문에 반면되는 파일 읽기 끝 ls
단지가 파일 시스템을 조회, 그것은 심볼릭 링크 자체를 저장하는 데 사용되는 크기를보고합니다.
나는 아직 생각하지 않은 다른 차이점이 있다고 확신하지만, 이러한 차이점의 근본 원인에 대해 명확하고 간단한 설명을 해 줄 것이라고 생각했습니다.
seek()
. 이것은 strace wc -l
몇 개의 큰 파일을 실행 한 후에 그렇습니다 .
일반 파일의 경우 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
이것은 아마도 무언가가 특별한 파일인지 알아내는 방법입니다.
wc -c
나를 위해 적어도 호출 fstat
하지만 다른 목적으로 보인다. lseek
끝까지 ing 하여 파일의 길이를 찾습니다 . 이것이 오류를 반환 read
하면 전체 파일입니다.