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


18

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

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

1
흥미로운 질문입니다. 파일 시스템의 블록 크기에 해당하면 소스와 대상이 다른 드라이브 / I 와인 더입니까?
davidgo

안녕하세요 @davidgo, 소스와 대상은 동일한 드라이브에서 다른 디렉토리입니다. 질문을 ls -la결과로 업데이트했습니다 .
Hirurg103

2
어떤 파일 시스템? 디렉토리 자체가 필요한 것보다 더 클 수 있습니다 (더 많은 공간을 차지). 이 질문을 비교하십시오 . 로 작성된 새 디렉토리 cp는 필요한만큼 정확하게 커집니다.
Kamil Maciorowski

ls -ls파일이 사용중인 디스크 공간을 확인하는 데 사용 하십시오.
Barmar

1
재귀 md5sum은 모든 파일이 실제로 복사되고 내용이 동일한 지 확인해야 할 때 친구입니다. rsync는 전체 구조와 파일을 복사하고 확인할 수있는 또 다른 도구이며 일부 파일이 이미있는 경우 프로세스 속도를 높입니다.
GoFundMonica-codidact.org

답변:


21

그 때문입니다 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.


1
뿐만 아니라 스파 스 파일 만 압축 된 파일과 인라인 파일을 / 상주 파일은 또한 파일 크기보다 작은되기 위해 디스크의 크기를 일으킬
phuclv

1
btrfs / zfs에 이상한 결과가 있습니다.
발은

2
@val : BTRFS 압축은 du출력에 영향을 미치지 않습니다 . 압축 된 파일은 일반적인 길이! = 사용 된 블록 알고리즘을 사용하는 프로그램에 대해 희박하게 보입니다. btrfs.wiki.kernel.org/index.php/…
Peter Cordes

@PeterCordes 그러나 CoW는 du 출력을 꽤 의미가 없습니다.
val은

중복 파일은 어떻습니까? 현대 시스템은 중복 컨텐츠를 인식하여 공간을 절약 할 수 없습니까?
FreeSoftwareServers

12

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

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

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

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

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

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


1
또 다른 가능성을 찾아보세요! 그러나 OP의 경우 새로 생성되어 최적화 cp -a src_dir another_destination/되는 것처럼 보이지만 (과거의 생성 / 추가에서 더 큰 디렉토리가있을 수 있음) 실제로 필요한 것보다 클 수 있습니다. 그러나 결과 는 실제로 더 작습니다 ( ). another_destionationsrc_dirsrc_dir1112 < 1168
Matija Nalis

@MatijaNalis "Update"다음의 첫 번째 예만이 (1112 <1168) ... 아래의 예는 수치가 바뀌었고 첫 번째 예는 소스가 더 큼 (3782288 대 3502320)을 보여줍니다. OP의 오타일까요?
TripeHound

> In the listings in your update, there are 3 directories you haven't listed. 실제로 이들은 디렉토리가 아닌 파일입니다. 파일 이름을 참조하십시오 > if one of the directories in your original tree had many files at some point, which were later deleted. rsync 명령을 사용하여 원격 서버에서 소스 디렉토리를 복사했지만 그 디렉토리에서 아무것도 삭제하지 않았습니다.
Hirurg103

1
@ Hirurg103의 .항목은 inode에 5 개의 링크를 표시합니다. 하나는 상위 디렉토리에서이 디렉토리로의 링크입니다. 다른 하나는 .입니다. ..하위 디렉토리의 링크 인 3 개의 링크가 더 있습니다 . 내가 이상한 것을 놓치지 않으면, 그 안에 3 개의 하위 디렉토리가 있어야합니다. 당신은 그 목록이 전체 출력이라고 말하는가?
jcaron
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.