cp 명령으로 복사 한 디렉토리가 원본보다 작은 이유는 무엇입니까? 싶습니다. du -s

많은 파일을 가진 하나의 디렉토리를 다른 대상으로 복사하려고합니다. 나는했다 :

cp -r src_dir another_destination/

그런 다음 대상 디렉토리의 크기가 원래 디렉토리의 크기와 동일한 지 확인하고 싶습니다.

du -s src_dir
3782288 src_dir

du -s another_destination/src_dir
3502320 another_destination/src_dir

그런 다음 cp명령이 따르지 않고 몇 가지 기호 링크가있을 수 있다고 생각 하고 -a플래그를 추가했습니다 .

-a -pPR 옵션과 동일합니다. 디렉토리 구조가 아닌 파일의 구조와 속성을 유지합니다.

cp -a src_dir another_destination/

그러나 du -s나에게 같은 결과를 주었다. 소스와 대상 모두 동일한 수의 파일과 디렉토리를 가지고 있다는 것이 흥미 롭습니다.

tree src_dir | wc -l
    4293

tree another_destination/src_dir | wc -l
    4293

du명령으로 다른 크기를 얻는 것은 무엇을 잘못하고 있습니까?

최신 정보

du명령 으로 개별 디렉토리의 크기를 얻으려고 하면 다른 결과가 나타납니다.

du -s src_dir/sub_dir1
1112    src_dir/sub_dir1

du -s another_destination/src_dir/sub_dir1
1168    another_destination/src_dir/sub_dir1

로 파일을 볼 때 ls -la개별 파일 크기는 동일하지만 총계가 다릅니다.

ls -la src_dir/sub_dir1
total 1168
drwxr-xr-x     5 hirurg103  staff     160 Jan 30 20:58 .
drwxr-xr-x  1109 hirurg103  staff   35488 Jan 30 21:43 ..
-rw-r--r--     1 hirurg103  staff  431953 Jan 30 20:58 file1.pdf
-rw-r--r--     1 hirurg103  staff  126667 Jan 30 20:54 file2.png
-rw-r--r--     1 hirurg103  staff    7386 Jan 30 20:49 file3.png

ls -la another_destination/src_dir/sub_dir1
total 1112
drwxr-xr-x     5 hirurg103  staff     160 Jan 30 20:58 .
drwxr-xr-x  1109 hirurg103  staff   35488 Jan 30 21:43 ..
-rw-r--r--     1 hirurg103  staff  431953 Jan 30 20:58 file1.pdf
-rw-r--r--     1 hirurg103  staff  126667 Jan 30 20:54 file2.png
-rw-r--r--     1 hirurg103  staff    7386 Jan 30 20:49 file3.png



답변

그 때문입니다 du기본 프로그램이 아닌 파일 (들)의 크기,하지만 그들은 사용하는 디스크 공간. 사용 된 -b총 디스크 공간 대신 ​​파일 크기의 합계를 얻으려면 이 옵션 을 사용해야합니다 . 예를 들면 다음과 같습니다.

% printf test123 > a
% ls -l a
-rw-r--r-- 1 mnalis mnalis 7 Feb  1 19:57 a
% du -h a
4,0K    a
% du -hb a
7       a

파일 길이가 7 바이트에 불과하더라도 전체 4096 바이트의 디스크 공간을 차지합니다 (특정 예에서는 사용 된 파일 시스템, 클러스터 크기 등에 따라 다름).

또한 일부 파일 시스템은 소위 스파 스 파일을 지원하는데,이 파일은 모두 0 인 블록에 디스크 공간을 사용하지 않습니다. 예를 들면 다음과 같습니다.

% dd if=/dev/zero of=regular.bin bs=4k count=10
10+0 records in
10+0 records out
40960 bytes (41 kB, 40 KiB) copied, 0,000131003 s, 313 MB/s
% cp --sparse=always regular.bin sparse.bin
% ls -l *.bin
-rw-r--r-- 1 mnalis mnalis 40960 Feb  1 20:04 regular.bin
-rw-r--r-- 1 mnalis mnalis 40960 Feb  1 20:04 sparse.bin
% du -h *.bin
40K     regular.bin
0       sparse.bin
% du -hb *.bin
40960   regular.bin
40960   sparse.bin

즉, 모든 파일이 복사되었는지 확인하려면 du -sb대신을 사용하십시오 du -s.


답변

“files”디렉토리의 크기 때문일 수 있습니다.

대부분의 파일 시스템, 디스크에서 디렉토리는 일반 파일 (주로 이름과 노드 번호 목록 만 있음)과 비슷하며, 블록이 커질수록 더 많은 블록을 사용합니다.

많은 파일을 추가하면 디렉토리 자체가 커집니다. 그러나 나중에 많은 파일 시스템에서 제거하면 디렉토리가 축소되지 않습니다.

따라서 원래 트리의 디렉토리 중 하나에 특정 시점에 많은 파일이 있고 나중에 삭제 된 경우 해당 디렉토리의 사본은 현재 파일 수에 필요한만큼의 블록 만 사용하므로 “더 작아집니다”.

업데이트 목록에는 나열하지 않은 3 개의 디렉토리가 있습니다. ls -al결과물 에서 그 (또는 그 자손)의 크기를 비교하십시오 .

차이점이있는 곳을 찾으려면 ls -alr두 디렉토리 모두에서 파일로 리디렉션 한 다음 diff두 출력 중 하나 를 시도 하십시오 .


답변