명령줄 옵션과 함께 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
그리고 심볼릭 링크는 역참조되지 않습니다. 내가 뭐 놓친 거 없니?
답변1
기본적으로 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
둘 다 심볼릭 링크를 따르고 대상 파일을 여러 번 계산할 수 있습니다.