파일을 이동하고 진행률을 보는 방법 (예 : 진행률 표시 줄)은 어떻게합니까?


118

을 사용하여 큰 디렉토리를 이동할 때 mv진행률을 볼 수있는 방법이 있습니까 (%)? cpgentoo 의 명령 -g에는 진행 상황을 보여주는 스위치가 있습니다.


3
파일을 이동할 때 이러한 도구를 쉽게 사용할 수 있는지는 모르겠지만 쉘에서 파이프 처리량을 측정하는 것이 도움이 될 수 있습니다.
Michael Mrozek

답변:


50

패치 된 cp 및 mv를 빌드 한 다음 둘 다 -g 스위치를 지원하여 진행률을 표시 할 수 있습니다. 이 페이지 에는 지침과 패치가 있습니다 . 그러나 : 페이지에서 지시합니다

$ sudo cp src/cp /usr/bin/cp
$ sudo cp src/mv /usr/bin/mv

원래 cp 및 mv를 덮어 씁니다. 여기에는 두 가지 단점이 있습니다. 첫째, 업데이트 된 coreutils 패키지가 시스템에 도착하면 덮어 씁니다. 둘째, 패치 된 버전에 문제가 있으면 표준 cp 및 mv에 의존하는 스크립트가 중단 될 수 있습니다. 차라리 이런 식으로 뭔가를하고 싶습니다 :

$ sudo cp src/cp /usr/local/bin/cpg
$ sudo cp src/mv /usr/local/bin/mvg

파일을 사용자가 컴파일 한 프로그램을위한 / usr / local / bin으로 복사하고 다른 이름을 지정합니다. 따라서 진행률 표시 줄을 원할 때 mvg -g bigfile /mnt/backup일반적으로 mv 를 말하고 사용합니다.

또한 진행률 표시 줄 alias mvg="/usr/local/mvg -g"을 말하고 mvg bigfile /mnt/backup직접 가져 오기 만하면됩니다.


2
불행히도“이 페이지”의 패치는 더 이상 존재하지 않으며 웹 아카이브에서 색인이 생성되지 않은 것으로 보입니다. 이름과 기능이 비슷한 패치많이있는 것 같습니다. 답을 편집하여 어떤 패치 를 의미 할 수 있습니까?
Gilles

내 생각 github.com/atdt/advcpmv는 그래서 그것을 가리 키도록 링크를 변경 유효한 후계자이며 동일한 패치가 있습니다.
fschmitt

93

더 간단한 솔루션이있을 때 coreutil에서 바이너리를 덮어 쓰는 아이디어가 마음에 들지 않으므로 여기에 내 것이 있습니다.

rsync : Rsync는 파일을 복사 -P하고 진행률 표시 줄에 대한 스위치가 있습니다. 따라서 rsync를 설치 한 경우 쉘 도트 파일에 간단한 별칭을 사용할 수 있습니다.

alias cp='rsync -aP'

단점은 rsync가 cp보다 약간 느리지 만 시간이 지남에 따라 측정하고 자신을 결정해야한다는 것입니다.

셸 스크립트 : 셸 스크립트는 진행률 표시 줄을 만들 수도 있습니다. 나는 그물에서 이것을 얼마 전에 발견했고 그 출처를 기억하지 못한다.

#!/bin/sh
cp_p()
{
   strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \
      | awk '{
        count += $NF
            if (count % 10 == 0) {
               percent = count / total_size * 100
               printf "%3d%% [", percent
               for (i=0;i<=percent;i++)
                  printf "="
               printf ">"
               for (i=percent;i<100;i++)
                  printf " "
               printf "]\r"
            }
         }
         END { print "" }' total_size=$(stat -c '%s' "${1}") count=0
}

이것은 다음과 같습니다

% cp_p /home/echox/foo.dat /home/echox/bar.dat
66% [===============================>                      ]

:

'bar'-ASCII 진행률 표시 줄이있는 'cat'

bar모든 종류의 작업 (cp, tar 등)에 대한 프로세스 표시 줄을 표시하는 작은 쉘 스크립트입니다. 프로젝트 홈페이지 에서 예제를 찾을 수 있습니다 .

또한 본 쉘을 위해 작성되었으므로 어디에서나 근처에서 실행됩니다.


3
barmv아직 랩핑하지 않습니다 .
Tobu


1
참고 rsync대체하지 않습니다 mv이 같은 기록 중 복사 파일 시스템에 빠르게 복사에 관해서 특히, 완전히 (영업 이익에 대한 요구하고있다) btrfs.
Karl Richter

74

라는 새로운 도구있다 progress실행중인 명령에 관련된 설명을 찾아 진행 상황과 속도를 표시 할 수 있습니다 : 가능 여기에

progress -w

실행중인 모든 cp, mv 등의 작업에 대한 통계를 출력합니다.


3
와우, 나는 이것이 굉장한 것을 기대하지 않았다! progress설치 후 간단히 입력하면 mv현재 대기중인 명령에 대한 진행률이 표시 됩니다. 감사!
jredd

3
감사! 루트로 물건을 옮길 때는 반드시 사용해야하는 것 같습니다 sudo(동일한 사용자) watch. 2 초마다 무슨 일이 일어나고 있는지 말할 수도 있습니다 .watch progress -w
Wilf

6
멋진 프로그램이지만 예를 들어 파일이 많은 폴더를 이동하면 전체 파일이 아닌 현재 파일의 진행률 만 표시됩니다. 대신 watch progress -wprogress -m
mxmlnkn을

6
IMHO, 이것이 문제를 해결하기위한 가장 유닉스적인 방법입니다. coreutils를 패치하거나 특정 목적 (mv의 rsync 등)으로 지정되지 않은 도구를 사용하거나 과도한 스크립트를 작성하는 대신, 주제를 위해 작성된 도구를 사랑으로 사용하십시오.
Grief

34

파이프 뷰어 명령 pv을 사용 하여 진행률 표시 줄을 표시 할 수 있습니다 .

pv /original/file > /new/file

나는 종종 (결합 탑재 된 네트워크 파일 시스템을 통해 큰 파일을 복사하려면이 옵션을 사용 gzip하고 tar). 단점은 디렉토리가 아닌 하나의 파일 만 복사 할 수 있다는 것 입니다. 그리고 당신은 새 파일에 이름을 주어야합니다, 당신은 단지 같은 대상 디렉토리를 줄 수 없습니다 cp. 그러나 복사는 pv목적 이 아닙니다 . 이 도구는 강력한 도구이며 파일 복사 이상의 기능을 수행합니다. 의 더 많은 예는 홈페이지를 참조하십시오 pv.

더 나은 옵션은을 사용하는 것 rsync -aP입니다. 당신이 원하는 경우 mv대신, 플래그를 추가합니다 --remove-source-files. .bashrc명령을 자주 사용하려면 이것을 추가하십시오 .

alias rscp='rsync -aP'
alias rsmv='rsync -aP --remove-source-files'

여기의 단점은 rsync이며 진행률 표시 줄이 아닌 진행률 만 보여줍니다.


tar cf - source-dir | pv | tar xf - -C out-dir전체 디렉토리의 처리량을 제공합니다. 크기를 알고 -spv로 전달 하면 진행률을 높일 수 있습니다.
arantius

6

진행률 표시 줄이있는 디렉토리를 이동 / 복사하지만 터미널이 아닌 GUI를 피하는 것이 목표 인 경우 mc (Midnight Commander)를 사용하는 것이 좋습니다.


3

내 해결책은을 사용하는 것 rsync입니다. 디렉토리를 복사하고 성공적으로 복사 한 후 소스 파일을 제거 (따라서 "이동")하고 진행률 보고서를 표시 할 수 있습니다 (특히 부분적으로 복사 된 디렉토리 동기화 및 네트워크 작업).

진행률 보고서와 함께 rsync를 사용하여 디렉토리를 이동하는 방법은 다음과 같습니다.

rsync -aP --remove-source-files $src $dst && rm -r $src

확인 $src않습니다 하지 , 그렇지 않으면 당신은 GNU보다 다른 의미를 얻을 것이다, 백 슬래시로 끝 cp.

rm -r때문에 말은 필요 --remove-source-files하나 하나가 성공적으로 디렉토리를하지 복사 한 후에 만이 소스 파일을 제거합니다. 는 &&rsync를 성공적으로 완료 경우에만 실행을 확인합니다. 당신이 편집증 환자 인 경우에, 당신은 재귀 어떤 종류로 교체 할 수 있습니다 rmdir, 같은find $src -d -exec rmdir {} +

유일한 결함은 -P옵션이 전체 복사 작업이 아닌 각 파일의 진행률을 표시 한다는 것 입니다. 작은 파일이 많은 디렉토리를 이동하려는 경우이 방법이 유용하지 않을 수 있습니다. rsync의 최신 개발 버전 --info=progress2에는 전체 작업의 진행률을 나타내는 대체 플래그 가 있습니다.


2

에 진행 표시 줄을 추가하는 패치 coreutil 방지하려면 mv및 것은 cp, gcp(Goffi의 복사기) 새로운 대안 : http://wiki.goffi.org/wiki/Gcp/en

재귀 및 자세한 cp옵션과 동일한 방식으로 사용합니다 .-r-v

여러 명령이 동시에 호출 될 때 파일 큐를 사용합니다. 또한 복사 된 파일 이름을 로그에 기록 할 수 있습니다 . 자세한 내용 은 소스 저장 매뉴얼 페이지 섹션을 참조하십시오.

다음은 시작하기에 좋은 자습서입니다 gcp. http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/


cp의 gcp와 같은 gmv가 있습니까?
CodyChan

나는 동등한 것을 찾지 못했습니다. 그건 그렇고, 단일 파일 시스템에서 "mv"를 실행할 때 진행률 표시 줄이 필요하지 않습니다 ... 매우 빠릅니다. 서로 다른 두 파일 시스템간에 이동이 수행되면 cp로 구현 된 다음 성공하면 소스를 제거하거나 실패하면 대상을 제거합니다. gcp를 기반으로하는 간단한 쉘 스크립트가 제대로 작동 할 수 있습니다 (원본과 대상이 실제로 다른 파일 시스템에 있는지 먼저 확인)
Yves Martin

2

첫째 : 30 분 이상 컴퓨터를 사용하지 않으려는 경우를 제외하고는 ionice를 사용하지 않고 큰 파일을 복사하지 않습니다.

두 번째 : 모든 파티션이 축소되어 파티션 내 복사 시간이 걸리지 않습니다. 그것이 긴 사본이라면 나는 du -sm파일을 처리 df -m | grep copy_to_partition합니다. 그런 다음 얼마나 많은 시간이 걸리는지 궁금하다면 df다시하고 파일이 얼마나 복사되었는지 확인하십시오.


이온 성 팁을 공유 하시겠습니까? mv cpu-wise 및 disk i / o wise에 어떤 우선 순위를 부여 하시겠습니까? 여기 내 설정이 있지만 renicing 후에도 CPU로드는 여전히 높습니다 : imgur.com/a/DLMJplz
ychaouche

2

내 민트에서 나는 이것 또는 컬 솔루션에 gcp를 사용하고 싶다 (정말 멋지다)

gcp SOURCE DESTINATION

설치해야 할 수도 있습니다 sudo apt-get install gcp

그리고 진행률 표시 줄에 대한 정보가있는 매우 훌륭하고 훌륭한 작업

  • 총계
  • 받은 %
  • % Xferd
  • 평균 DL
  • 속도 업로드
  • 남은 시간
  • 보낸 시간
  • 총 시간
  • 현재 속도

읽을 수있는 형식은 다음과 같습니다.

curl -o DESTINATION FILE://source

또한 먼저 설치해야 할 수도 있습니다 sudo apt-get install curl


gcp파일 이동을 지원하지 않습니다. 즉, 성공적인 복사 후 소스 파일을 수동으로 제거해야합니다.
Karl Richter

2

이렇게하면 진행률 표시 줄을 제공하지만, 공격하지 않는 CTRL-T당신은 보내드립니다 SIGINFOmv가에 작동하고 파일과 얼마나 멀리 따라 그것이 그 과정에서 어떤보고 할 것이다. 대용량 파일 전송에는이 기능을 사용하는 것이 매우 편리하며 여러 개의 작은 파일 전송에는 유용하지 않을 수 있습니다.

빠른 예 :

mv 135/61 /Volumes/Jules/135/
# hit C-t
load: 1.08  cmd: cp 35470 uninterruptible 0.00u 0.04s
135/61/1/1-s2.0-S006738-main.pdf -> /Volumes/Jules/135/61/1/1-s2.0-S006738-main.pdf  68%

1
이것은 나를 위해 작동하지 않았습니다 : INFO: unknown signal; killall -l lists signals. SIGINFO가 표준 POSIX가 아닌 일부 BSD에만 있다고 생각합니다.
Brian Minton

2
권리. Mac OS X에서는 작동하지만 Ubuntu에서는 작동하지 않을 수 있습니다.
찰스

1

mv -v이동 된 파일 당 한 줄 pv -l을 인쇄하고 줄 수 (실제 파일 수)를 기준으로 진행률 을 인쇄하는 데 사용 합니다 .

필요합니다 pv(파이프 뷰어) : http://www.ivarch.com/programs/pv.shtml

mv -v sourcedir targetdir | pv -l -s filecount > logfile

파일 수를 얻으려면 다음 명령을 사용하십시오.

find sourcedir | wc -l

이 명령은 복사 된 파일 수를 기준으로 진행 정보를 표시합니다. 작은 파일이 많을 때 가장 효과적입니다. 거대한 파일이 몇 개만 있으면 재미가 없을 것입니다.

그 주 mv빨리해야 동일한 파티션에. mv다른 파티션에 대해서는 cp source target뒤에 나오는 것과 동일 합니다 rm source. 다음은 진행 정보가있는 디렉토리를 복사하는 두 가지 명령입니다.

복사 된 파일 수를 기준으로 진행 상황을보고하려면 :

cp -av sourcedir targetdir | pv -l -s filecount > logfile

복사 된 바이트를 기준으로 진행 상황을보고하려면 :

tar c sourcedir | pv -s size | tar x -C targetdir

자세한 내용은 여기를 참조하십시오 : 디렉토리 복사를 위해 pv를 통한 진행 정보


1

나는 'mv'명령을 시작한 후에이 답변 검색하게되어 결국 다시 시작하고 싶지 않습니다. 이 상황에서 진행 상황을 모니터링하는 매우 간단한 방법 (또는 죽일만한 가치가 있는지 확인하는)은 다음을 실행하는 것입니다.

du -hs /directory/you're/moving/data/to

이렇게하면 디렉토리의 크기 만 인쇄되므로 얼마나 많은 데이터가 복사되었는지 확인하거나 몇 번 실행하여 데이터가 얼마나 빨리 전송되는지 확인할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.