cp
최근에 대규모 디렉터리 백업을 생성하는 명령을 실행했습니다 . 그래서 다음과 같은 명령을 사용했습니다.
cp -rv big_directory new_location
파일이 크기 때문에 이 명령을 실행하는 데 시간이 오래 걸리고 복사 진행 상황도 확인하고 싶었습니다. 그래서 du
다른 터미널에서도 다음과 같이 명령을 사용했습니다.
du -sh new_location/*
하지만 이 명령도 실행하는 데 시간이 오래 걸립니다. 특히 해당 디렉토리에 대용량 파일이 있는 경우에는 더욱 그렇습니다.
cp
명령을 실행하는 데 10분이 걸린다고 가정합니다 . du
명령을 시작한 지 1분 후에 시작 하고 실행하는 데 1분이 걸린다고 cp
가정하면 ? 의 출력을 du
신뢰할 수 있는지 알고 싶습니다 .du
시작 시(t=1분) 어떤 일이 발생하는지에 대한 신뢰할 수 있는 출력을 제공합니까, 아니면 실행 시간이 끝날 때(t=2분) 어떤 일이 발생하는지에 대한 출력을 du
제공합니까 ? 분명히 복사로 인해 명령 시작과 끝 사이에 du
디렉토리 크기가 변경되었습니다.new_location
du
답변1
@derobert가 du
작동 방식을 설명합니다.
그는 아주 큰 양의 작은 파일/디렉토리(따라서 메타데이터를 위한 많은 메모리)가 없는 한 du
즉시 다시 실행하면 일반적으로 더 빠른 결과를 얻을 수 있다는 점을 언급하지 않았습니다.
파일이 크다고 해서 du
속도가 느려지는 것은 아니지만 파일을 복사하면 디렉터리 캐시가 메모리에서 부족해질 가능성이 높습니다. (데스크톱 응답성이 향상될 수 있습니다.를 설정 vm.swappiness=10
하고 sysctl 설정을 사용하여 데이터보다 메타데이터의 우선순위를 지정합니다 vm.vfs_cache_pressure=60
(에 넣습니다 /etc/sysctl.d/99-local
.)
여러 프로세스가 동시에 파일 시스템에 액세스하는 경우 각 시스템 호출은 런타임 상태 스냅샷에 대한 정보를 얻습니다. 예를 들어, 프로세스는 파일이 존재하는지 확인한 다음 파일을 열려고 시도했지만 더 이상 존재하지 않는다는 것을 발견할 수 있습니다. 다른 프로세스가 확인 사이의 시간 간격으로 이름을 바꾸거나 제거했기 때문입니다. (이로 인해 문제가 발생하거나 오류의 원인이 되는 경우 이를 경쟁 조건이라고 합니다.)
디렉터리 순회 순서가 du
선택한 순서와 동일 하면 아직 수정 중인 디렉터리 cp
는 du
실행이 거의 끝날 때까지 도달하지 않으므로 마지막에 너무 많은 시간을 놓치지 않습니다. OTOH, 새 파일 du
이 있는 디렉터리를 먼저 합산 cp
한 다음 잠시 시간을 내어 나머지를 합산하면 결과가 유효하지 않게 됩니다.
답변2
du
디렉터리를 반복적으로 검색하여 모든 파일과 디렉터리의 크기를 계산하는 방식으로 작동합니다. 그것은 다음과 같습니다:
- 명령줄에 지정된 첫 번째 디렉터리에서 시작합니다.
stat
크기를 결정하고 전체에 추가하는 디렉토리- 디렉터리에서 첫 번째 항목(파일 또는 하위 디렉터리 이름)을 읽습니다.
- 파일인 경우
stat
전체에 추가하세요. - 디렉터리인 경우( 물론
.
가 아님..
) 하위 디렉터리에 대해 2~7단계를 수행합니다. - 다른 항목이 있으면 읽고 4로 돌아갑니다. [궁금할 수도 있습니다.
cp
단일 디렉터리를 스캔하는 동안 다른 항목이 추가되면 어떻게 될까요?du
이것기준나타날 수도 있고 나타나지 않을 수도 있음 - 지정되지 않음. ] - 디렉토리 크기 인쇄
귀하의 경우와 같이 디렉터리와 파일이 du
모두 변경되는 경우 제공되는 크기는 처음부터 끝까지의 크기가 아니라 그 사이의 크기이지만 정확하지는 않습니다. 하지만 적어도 cp
.
진행률 표시기를 얻으려면 @roaima의 제안 외에도 ( 빠른 검색으로 찾음) 및 와 같은 복잡한 항목이 rsync
있습니다 .cp -v
gcp
(cd /src && tar c .) | pv -pterb -s $(du -sb /src) | (cd /dst && tar x)
답변3
이미 rsync
설치한 경우 다음과 같이 복사 진행 상황을 볼 수 있습니다.
rsync -vP big_directory new_location
권한, 타임스탬프, 소유권 등을 보존하려면 -a
에 플래그를 추가 rsync
하거나 -p
에 플래그를 추가하면 됩니다 cp
.
du
이 대답은 사용된 디스크 공간의 근사치를 확인하기보다는 실제로 복사 진행 상황을 보고 싶다는 가정을 사용하지 않습니다 .