`-L` 플래그를 사용한`du` 명령의 동작 파일을 작성하십시오. perl -e ‘print

커맨드 라인 옵션 du과 함께 사용하면 커맨드에 이상한 동작이 나타났습니다 -L.

Slackware 14 및 Coreutils 8.19를 사용하고 있습니다.

이상한 동작을 재현하려면 두 개의 폴더를 작성하십시오.

mkdir foo
mkdir bar

폴더 중 하나 안에 파일을 작성하십시오.

perl -e 'print "A"x10000' > foo/text

다른 폴더의 심볼릭 링크 :

ln -s ../foo/text bar/text

다음을 입력하면

du -h -L bar

당신은 얻을 것이다:

16k bar

심볼릭 링크가 역 참조 되었기 때문에. 그러나 다음을 입력하면

du -h -L *

당신은 얻을 것이다:

16K     foo
4.0K    bar

심볼릭 링크는 역 참조되지 않습니다. 뭔가 빠졌습니까?



답변

기본적 du으로 여러 번 연결된 경우 각 파일을 한 번만 계산합니다. 실행 du -L bar하면 파일이 한 번만 도달하기 때문에 파일을 계산합니다. 그러나 실행 du -L *하면 처음 볼 때만 계산합니다. 예를 들면 다음과 같습니다.

$ du -L foo bar
16K     foo
4.0K    bar

$ du -L bar foo
16K     bar
4.0K    foo

인수 순서를 바꾸면 16K로보고되는 폴더가 변경됩니다.

매개 변수 du를 전달하여 파일을 두 번 세 도록 강제 할 수 있습니다 -l.

편집하다:

심볼릭 링크는 특별한 종류의 파일이므로 링크를 따라 가려면 추가 단계가 필요합니다. 옵션이 활성화 du되어 있지 않으면 기호 링크를 따르지 않습니다 -L.

반면에 하드 링크는 기본적으로 두 개 이상의 폴더에 존재하는 하나의 파일입니다. du아마도 두 번 계산하지 않기 위해 inode 번호로 본 파일을 추적합니다. -l이 동작을 비활성화합니다.

따라서 그냥로 -L심볼릭 링크를 따르지만 대상 파일에 inode 번호가 있으면 이미 계산 된 것으로 간주되지 않습니다. 그냥 -l이 중복 하드 링크를 계산하지만, 심볼릭 링크를 따르지 않습니다.

당신이 사용하는 경우 -l-L함께, 그것은 모두 심볼릭 링크를 따라, 또한 번 이상 대상 파일 (들)을 계산하실 수 있습니다.


답변