Làm cách nào để hiển thị tiến trình và tốc độ truyền khi sao chép tệp bằng cp?


Câu trả lời:


249

Mặc dù cpkhông có chức năng này, bạn có thể sử dụng pvđể làm điều này:

pv my_big_file > backup/my_big_file

Lưu ý: phương pháp này sẽ mất quyền và quyền sở hữu của tệp. Các tệp được sao chép theo cách này sẽ có cùng quyền như thể bạn tự tạo chúng và sẽ thuộc về bạn.

Trong ví dụ này, pvvề cơ bản chỉ xuất ra tệp thành thiết bị xuất chuẩn * mà bạn chuyển hướng đến một tệp bằng >toán tử. Đồng thời, nó in thông tin về tiến trình tới thiết bị đầu cuối khi bạn làm điều đó.

Đây là những gì nó trông giống như:

stefano@ubuntu:~/Data$ pv my_big_file > backup/my_big_file
 138MB 0:00:01 [73.3MB/s] [=================================>] 100% 

Bạn có thể cần  Cài đặt pv (cách khác, loại sudo apt-get install pv) trên hệ thống của bạn.


*: Bit kỹ thuật

Có ba luồng dữ liệu quan trọng trong một hệ thống giống như unix: stdout (đầu ra tiêu chuẩn), stderr (lỗi tiêu chuẩn) và stdin (đầu vào tiêu chuẩn). Mỗi chương trình có tất cả ba, để nói chuyện. Các >nhà điều hành chuyển hướng chuyển hướng đầu ra chương trình vào một tập tin. Không có đối số, như bạn thấy ở trên, >chuyển hướng đầu ra tiêu chuẩn của chương trình thành một tệp. cpvề cơ bản không có gì lạ hơn

cat source > destination

(nơi catchỉ cần đọc một tập tin và in nó ra thiết bị xuất chuẩn). pvcũng giống như con mèo, nhưng nếu bạn chuyển hướng luồng đầu ra của nó ở một nơi khác, nó sẽ in thông tin tiến trình lên thiết bị xuất chuẩn.

Hãy xem man pvđể tìm hiểu thêm về nó.


Một tùy chọn khác, như văn bản thay thếDoR gợi ý trong câu trả lời này , là sử dụng rsync thay thế:

$ rsync -ah --progress source-file destination-file
sending incremental file list
source-file
        621.22M  57%  283.86MB/s    0:00:01

Điều này sẽ bảo vệ các quyền / quyền sở hữu tập tin trong khi hiển thị tiến trình.


3
Nó có thể có hoặc không đáng kể (tùy theo tình huống), nhưng pvkhông xử lý các quyền giống như cp... (dựa trên một thử nghiệm nhanh mà tôi đã thử: pvkhông sao chép bit thực thi .. rsyncđã làm.
Peter .O

45
IMO: alias cp="rsync -avz"cp đã lỗi thời.
Marco Ceppi

11
Nếu bạn giống tôi và quên đi pv, bạn có thể rình mò /proc/PID of cp/fd/proc/PID of cp/fdinfotìm hiểu tiến trình. (Tùy thuộc vào bạn để suy ra tốc độ.) Tôi sử dụng kỹ thuật này để xem updatedb.
Thanatos

11
Có, -zcó lẽ chỉ nên được sử dụng cho các bản sao mạng; nén và giải nén dữ liệu cho một bản sao cục bộ là chi phí thuần túy.
Matthew đọc

3
@MarcoCeppi, khi sao chép thư mục với rsyncđảm bảo không thêm dấu vết /vào đường dẫn nguồn (hoặc xóa nếu ví dụ bash hoàn thành đặt nó ở đó tự động). Nếu không, bạn sẽ nhận được kết quả khác với khi sử dụng cp(hoặc gcp).
Piotr Findeisen

185

Không có. Xem ở đây như tại sao. Mặc dù nó làm nhiều hơn bạn cần, rsynccó một --progresstham số. Các -asẽ giữ quyền, vv, và -hsẽ là con người có thể đọc được.

rsync -ah --progress source destination

Đầu ra sẽ trông giống như thế này:

Pictures/1.jpg
      2.13M 100%    2.28MB/s    0:00:00 (xfr#5898, to-chk=1/5905)
Pictures/2.jpg
      1.68M 100%    1.76MB/s    0:00:00 (xfr#5899, to-chk=0/5905)

4
Điều này hoạt động rất tốt trong Ubuntu hiện tại (14.10). Nó cũng hỗ trợ -rcờ để lặp lại các thư mục. Nó thậm chí có thể được đặt bí danh là một thay thế trực tiếp cho cp:alias cp="rsync -ah --progress"
rustyx

1
Hoạt động tốt trên OS X, với phần thưởng là có thể sử dụng các công cụ đi kèm với hệ thống.
Ivan X

3
Tôi thích sự thay thế này tốt hơn pv, đặc biệt vì rsync là một phần của bản cài đặt tiêu chuẩn
Joao Costa

1
@bartekbrak cảm ơn vì đã chia sẻ. Tôi hiện đang sử dụng macOS 10.12.x chạy phiên bản homebrew của rsync 3.1.2 và việc sử dụng --progresskhiến đầu óc tôi quay cuồng 🙃 xem tất cả màn hình đầu ra trong thiết bị đầu cuối. Vì vậy, những người đến đây từ các tìm kiếm từ khóa AOL, rsync -ah --info=progress2 [source] [destination] trình bày kết quả đầu ra một cách nhẹ nhàng hơn IMHO.
ipatch

2
Thật không may, đầu ra không hữu ích khi sao chép nhiều tệp nhỏ.
Raphael

89

Nếu bạn muốn xem các tệp của mình có được chuyển chính xác hay không, bạn có thể sử dụng gcpgcpgiống như cp nhưng theo mặc định sẽ cung cấp cho bạn một thanh tiến trình để bạn có thể xem những gì đang được sao chép. Như các ghi chú wiki của chương trình , gcpcó một số tính năng hữu ích như

  • chuyển chỉ dẫn tiến trình
  • sao chép liên tục về lỗi (chuyển sang tập tin tiếp theo)
  • sao chép trạng thái ghi nhật ký: gcp ghi lại tất cả các hành động của nó để có thể biết tập tin nào đã được sao chép thành công
  • xáo trộn tên để xử lý các giới hạn hệ thống tệp mục tiêu (ví dụ: xóa các ký tự không tương thích "*" hoặc "?" trên FAT)

Tuy nhiên, ngay cả khi thanh tiến trình đã đạt 100% khi sử dụng công cụ, bạn phải đợi cho đến khi dấu nhắc thiết bị đầu cuối của bạn xuất hiện lại trước khi gỡ bỏ phương tiện của bạn một cách an toàn để bạn có thể đảm bảo quá trình chuyển đã kết thúc thành công.

gcpđược sử dụng để sao chép các tập tin và có các tùy chọn như --preservevậy để các thuộc tính và quyền khác nhau có thể được bảo tồn và --recursiveđể toàn bộ thư mục có thể được sao chép. Thông tin thêm về các tùy chọn của nó có thể được tìm thấy bằng cách nhập man gcphoặc bằng cách truy cập các trang web Ubuntu trực tuyến . Một hướng dẫn cũng có sẵn trên trang web này .

Cài đặt gcptừ kho với

sudo apt-get install gcp

( Lưu ý : trong Ubuntu 12.10, ví dụ: điểm tự động mới là /media/user/usbdisk)

Bạn có thể sao chép một tập tin vào phương tiện truyền thông của bạn bằng cách nhập

gcp /home/mike/file.mp4 /media/usb

và sao chép một thư mục vào phương tiện của bạn với

gcp -rv ~/Podcasts /media/Mik2

Đầu ra mẫu từ gcpvới thanh tiến trình:

gcp ~/Videos_incIplayer/mars.flv /media/Mik2
Copying 168.57 MiB 100% |########################################################|   7.98 M/s Time: 00:00:22

Tất nhiên bạn có thể chỉ định nhiều tệp hoặc thư mục để sao chép vào đĩa của mình và có rất nhiều tùy chọn khác được đề cập man gcp.


4
Có lỗi với nó qua sshdbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
msa7

3
nếu bạn có màn hình X11 mở trên máy, bạn có thể chỉ cần đặt export DISPLAY=:0.0trước khi bắt đầu gcp. Nếu máy không đầu thì bạn phải bắt đầu xsession thành bộ đệm khung ảo hoặc thứ gì đó, tại thời điểm đó có lẽ bạn chỉ nên tìm một chương trình khác
user292067

2
gcplà khá tốt nhưng yêu cầu DBUS / X là số lẻ. Tôi đã xử lý việc này qua SSH bằng cách sử dụng chuyển tiếp ssh: ssh -X user@hostvà điều đó cho phép tôi chạy nó.
Oli

68

Tôi nhận được một cú đá từ việc sử dụng cURL cho mục đích chính xác này. Trang man liệt kê giao thức "FILE" là được hỗ trợ, vì vậy chỉ cần sử dụng nó như bất kỳ giao thức nào khác trong URL:

curl -o destination FILE://source

Tốc độ, tiến độ, thời gian còn lại, và nhiều hơn nữa - tất cả trong một định dạng quen thuộc.


1
Điều này rất tốt, đặc biệt là trong các môi trường nơi bạn bị cấm cài đặt các công cụ mới và nơi rsync không khả dụng.

5
Rực rỡ, đây phải là một hack phải biết!
ionreflex

Câu trả lời tốt đẹp! Tài giỏi!
9301293

Điều này có lẽ có nhược điểm tương tự như pv, nó sẽ không lưu quyền.
Ploni

1
Ngọt! bất kỳ cách nào để làm cho công việc này cho một thư mục?
Joseph Rajeev Motha

28

Mặc dù tốc độ không hiển thị, nhưng khi sao chép nhiều tệp, -vtùy chọn vào cplệnh sẽ cung cấp cho bạn thông tin tiến trình. ví dụ

cp -rv old-directory new-directory

10
Thông tin tiến độ? Đây chỉ là đầu ra dài dòng. Để cung cấp thông tin tiến trình, ít nhất bạn cần phải có bao nhiêu tệp, hoặc thậm chí những tệp nào, cần được sao chép.
Julian F. Weinert

Nó cho thấy tập tin nào được bật, có thể đủ trong các trường hợp ít đòi hỏi hơn.
Gringo Suave

20

Nhân biết hầu hết các dữ liệu như tốc độ và thường là tỷ lệ phần trăm. Các hạt nhân hiện đại phơi bày điều này thông qua hệ thống tập tin / Proc của họ.

showspeed từ https://github.com/jnweiger/showspeed sử dụng thông tin đó. Nó có thể đính kèm với các chương trình đã chạy và cung cấp các cập nhật định kỳ như thế này:

$ dd if=bigfile of=/tmp/otherbigfile &
$ showspeed dd
dd looks like a process name. pid=4417 matches av0=dd.
p/4417/fd/0r /home/jw/bigfile 113MB/s (12%, 2.3GB)  9m:35
p/4417/fd/1w /tmp/otherbigfile 182MB/s (2.6GB)
p/4417/fd/0r /home/jw/bigfile 285MB/s (15%, 3.0GB)  8m:08
p/4417/fd/0r /home/jw/bigfile 115MB/s (16%, 3.2GB)  8m:01
p/4417/fd/0r /home/jw/bigfile 107MB/s (17%, 3.4GB)  7m:39
p/4417/fd/1w /tmp/otherbigfile 104MB/s (3.5GB)
p/4417/fd/0r /home/jw/bigfile 139MB/s (19%, 3.7GB)  7m:37
p/4417/fd/0r /home/jw/bigfile 116MB/s (20%, 3.9GB)  7m:18
p/4417/fd/1w /tmp/otherbigfile  67MB/s (4.0GB)
p/4417/fd/1w /tmp/otherbigfile 100MB/s (4.1GB)
...

Đẹp một. Làm thế nào nó làm việc ra tỷ lệ phần trăm mặc dù? Tôi đoán chỉ trong trường hợp tập tin s mở như chỉ đọc? Và nó có thể sẽ không hoạt động trong trường hợp truy cập rải rác.
j_kubik

1
Trong trường hợp này, bạn cũng có thể sử dụng một thiết bị đầu cuối khác để chạy pkill -USR1 ddđể ddhiển thị trạng thái của nó, một tùy chọn khác sẽ là watch -n 1 pkill -USR1 ddlàm cho nó hiển thị tiến trình của nó theo định kỳ (mỗi giây).
Yaron

Đúng. Nhiều công cụ có một cách dựng sẵn để báo cáo thống kê theo thời gian. dd cũng không ngoại lệ. Các triển khai hiện đại có một tùy chọn status = progess. Showspeed là một giải pháp "một công cụ cho một mục đích" cổ điển - giống như pv. Nhưng nó có các cách sử dụng khác nhau: Hãy nghĩ về những chiếc cốc bơm một tập tin thông qua ghostscript hoặc bạn muốn biết ETA cho một cp hoặc tar đang diễn ra. Nó có thể được thực hiện 95% sau vài giờ và có lẽ bạn không muốn khởi động lại chỉ để thêm pv ... Truy cập phân tán sẽ không hoạt động tốt. Chỉ hiển thị các mẫu tìm kiếm vị trí.
Jürgen Weigert

18

Có một công cụ được gọi progresstrong kho lưu trữ có thể kiểm tra các lệnh khác nhau và hiển thị thông tin tiến trình cho chúng.

Cài đặt nó bằng lệnh

sudo apt-get install progress

Công cụ này có thể được sử dụng như thế:

cp bigfile newfile & progress -mp $!

Đầu ra:

[11471] cp /media/Backup/Downloads/FILENAME.file 
        29.9% (24.2 MiB / 16 MiB)

12

Trong khi pvcó thể xử lý các cptác vụ cục bộ , sử dụng ddvới pvcó thể xử lý cả các tác vụ cục bộ ( cp) và từ xa ( scp).

dd if=path/to/source.mkv | pv | dd of=path/to/dest.mkv

Vui lòng đảm bảo path/to/dest.mkvlối thoát bằngtouch path/to/dest.mkv

Điều này có thể hiển thị tiến trình, nhưng nếu bạn muốn thông tin tỷ lệ phần trăm,

dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv

Thay thế 100Mở trên với kích thước thực của tập tin nguồn của bạn.

Ở đây có phần từ xa

Trong khi scpkhó có thể hiển thị tiến độ hiện tại, sử dụng ddvới pvlà một miếng bánh.

ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv

1
Mới hơn ddstatus=progress: Askubfox.com/a/824895/52975
Ciro Santilli

11

Có một công cụ mới gọi là cv có thể tìm thấy bất kỳ mô tả nào liên quan đến lệnh đang chạy và hiển thị tiến trình và tốc độ: https://github.com/Xfennec/cv

cv -w

xuất ra các số liệu thống kê cho tất cả các hoạt động cp, mv, vv đang chạy


watch cv -qthậm chí còn gọn gàng hơn
nwgat

Nó chỉ hiển thị tiến trình cho một tệp riêng lẻ, nó nhận ra liệu cpcó sao chép một thư mục đệ quy hay không.
Flimm

1
Nó chiến tranh đổi tên thành tiến bộ. Công cụ tuyệt vời!
sebastian

7

Như nhiều người đã nói, cp không bao gồm chức năng này.

Chỉ cần ném 0,02 đô la của tôi, những gì tôi thường làm với các tình huống sao chép tầm thường (tức là không -R):

  1. Xem tập tin lớn như thế nào và nhớ

  2. Bắt đầu sao chép

  3. Mở một thiết bị đầu cuối khác

  4. Chạy watch ls -lh DIRtrên thư mục chứa mục tiêu

Điều này có thể giữ cho tôi cập nhật về kích thước tệp mục tiêu, với một rắc rối tối thiểu.

Thay thế cho các tình huống ít tầm thường hơn, ví dụ: sao chép các thư mục đệ quy, bạn có thể sử dụng watch du -hs DIRđể xem tóm tắt về kích thước DIR. Tuy nhiên, du có thể mất nhiều thời gian để tính toán và thậm chí có thể làm chậm quá trình sao chép, vì vậy bạn có thể muốn sử dụng -n INTERVALđối số để xem để có thể chấp nhận đánh đổi.

Cập nhật: Trong trường hợp bạn sử dụng thẻ đại diện với lệnh được sử dụng với watch du, ví dụ: watch du -hs backup/*đừng quên trích dẫn:

watch "du -hs backup/*"

nếu không, các ký tự đại diện sẽ chỉ được mở rộng một lần , khi đồng hồ được bắt đầu để du sẽ không xem các tệp / thư mục con mới.


Không trả lời phần "tốc độ", mặc dù ...
Alois Mahdal

7

dd status=progress

Tùy chọn được thêm vào GNU Coreutils 8.24+ (Ubuntu 16.04):

dd if=src of=dst status=progress

Thiết bị đầu cuối hiển thị một dòng loại:

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s

Xem thêm: Làm thế nào để bạn theo dõi tiến trình của dd?


1
Ý bạn là: stdout là một luồng các ký tự và chuỗi thoát vt100 làm cho thiết bị đầu cuối của bạn hiển thị một dòng được cập nhật định kỳ;). stdout luôn là một luồng byte và không liên quan gì đến cách nó được hiển thị (ngoại trừ việc ứng dụng có thể biết liệu nó có được gắn vào một thiết bị đầu cuối hay không ...)
masterxilo

@masterxilo newbs sẽ không quan tâm, các chuyên gia sẽ biết ;-) hehe
Ciro Santilli 改造

Vâng, tôi nghĩ thật tốt khi nói những điều như chúng, có thể bỏ qua một số chi tiết, nhưng không bao giờ khiến độc giả của bạn tạo ra một mô hình tinh thần sai lầm. Nếu bạn nói "stdout là một dòng (được cập nhật định kỳ)" thì có vẻ như bạn đang nói rằng thiết bị xuất chuẩn là một khối bộ nhớ có thể thay đổi mà nó không phải là. Điều này rất quan trọng để biết ngay cả đối với người mới.
masterxilo

6

Nếu bạn có rsync 3.1 trở lên ( rsync --version), bạn có thể sao chép (cp -Rpn) trong khi duy trì quyền và quyền sở hữu, lặp lại các thư mục, "không ghi đè" và hiển thị tiến trình tổng thể (thay vì chỉ tiến triển theo tệp), tốc độ sao chép và ( rất thô) thời gian ước tính còn lại với:

sudo rsync -a --info=progress2 --no-i-r /source /destination

Lưu ý rằng sudo chỉ cần thiết nếu xử lý các thư mục / tệp bạn không sở hữu. Ngoài ra, không có --no-i-rphần trăm, phần trăm có thể đặt lại về số thấp hơn tại một số điểm trong quá trình sao chép. Có lẽ các phiên bản sau của rsync sẽ được mặc định là no-ir với thông tin = Progress2, nhưng nó không có trong phiên bản 3.1.2 hiện tại.

Tôi đã thấy rằng tỷ lệ phần trăm và thời gian còn lại được đánh giá quá cao khi sao chép vào một thư mục đã chứa các tệp (ví dụ như khi bạn thường sử dụng cp -n "không ghi đè").


3

Sử dụng tập lệnh shell:

#!/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
}

Điều này sẽ trông giống như:

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

Nguồn


3

Tùy thuộc vào những gì bạn muốn làm, Midnight Commander ( mc) có thể là câu trả lời. Tôi ngạc nhiên khi nó chưa được đề cập.

Các công cụ thích pvhoặc rsynctốt để hiển thị tiến trình chuyển một tệp lớn, nhưng khi cần sao chép toàn bộ thư mục / cây, hãy mctính kích thước và sau đó hiển thị tiến trình rất độc đáo. Thêm vào đó, nó có sẵn ngoài hộp trên hầu hết các hệ thống.


2
"nó có sẵn ngoài hộp trên hầu hết các hệ thống." ... Không phải trên bất kỳ cài đặt Ubuntu mặc định.
muru

1

một tùy chọn nữa để bảo toàn các thuộc tính có thể là (nếu sourcelà một thư mục, nó sẽ được tạo trong destination)

tar -c source | pv -e -t -p -r | tar -C destination  -x

hy vọng nó có thể hữu ích cho ai đó Để có thời gian chuyển ước tính, điều này có thể đạt được bằng cách thực hiện do -s sourcetrước và chuyển nó dưới dạng -s <size>tham số pv.


-f -là dư thừa. tarĐầu ra mặc định cho cvà đầu vào cho xstdout và stdin.
muru

Nó có thể phụ thuộc vào phiên bản OS / tar không? Tôi biết đó là một trang Ubuntu nhưng điều này có thể hữu ích cho các chủ sở hữu hệ điều hành khác như macOS
ciekawy

1
Không. Tất cả các triển khai lành mạnh (bao gồm tar của libarchive, mà macOS sử dụng) đều có hành vi này.
muru

chỉ cần xác minh trên macos và đề xuất của bạn là hoàn toàn hợp lệ - Tôi đã cập nhật câu trả lời của mình. Cảm ơn!
ciekawy

0

Bạn có thể sao chép sử dụng bất kỳ chương trình. Đồng thời, bạn có thể bắt đầu sudo iotopvà xem tốc độ đọc / ghi đĩa thực sự mà không cần tiến triển.


0

Kiểm tra mã nguồn cho Progress_bar trong kho git bên dưới

https://github.com/Kiran-Bose/sup tối cao

Ngoài ra, hãy thử gói bash script tùy chỉnh tối cao

Tải xuống tệp deb và cài đặt trong bản phân phối dựa trên debian hoặc tải xuống các tệp nguồn, sửa đổi và sử dụng cho các bản phát hành khác

Tổng quan về chức năng

(1) Mở ứng dụng ---- Firefox ---- Máy tính ---- Cài đặt

(2) Quản lý tập tin ---- Tìm kiếm ---- Điều hướng ---- Truy cập nhanh

            |----Select File(s)
            |----Inverse Selection
            |----Make directory
            |----Make file
                                          |----Open
                                          |----Copy
                                          |----Move
                                          |----Delete
                                          |----Rename
                                          |----Send to Device
                                          |----Properties

(3) Quản lý điện thoại ---- Di chuyển / Sao chép từ điện thoại ---- Di chuyển / Sao chép vào điện thoại ---- Đồng bộ hóa thư mục

(4) Quản lý USB ---- Di chuyển / Sao chép từ USB ---- Di chuyển / Sao chép sang USB


0

pv biết làm thế nào để xem các mô tả tập tin được cung cấp một pid, cho dù đó là cp hoặc cái gì khác

Từ tài liệu:

   (Linux only): Watching file descriptor 3 opened by another process 1234:

          pv -d 1234:3

   (Linux only): Watching all file descriptors used by process 1234:

          pv -d 1234

Thí dụ:

md5sum file &
[1] + 1271 suspended
pv -d 1271
417MiB 0:00:17 [12,1MiB/s] [============>                                 ] 29% ETA 0:00:53

$ cp file.mov copy.mov &
[2] 3731
$ pv -d 3731
3:/media/windows/file.mov:  754MiB 0:00:04 [97,2MiB/s] [======================>                       ] 52% ETA 0:00:07
4:/media/windows/copy.mov:  754MiB 0:00:04 [97,3MiB/s] [     <=>                                                                   ] 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.