Có thể thấy tốc độ cp và phần trăm được sao chép?


251

Tôi gặp vấn đề khi sao chép các tệp lớn bằng nautilus (nó bị kẹt). Tôi cần sao chép, sử dụng cp. Tôi muốn biết nếu có bất kỳ tham số nào cho thấy% được sao chép và tốc độ truyền tải.


39
Bạn có thể sử dụng rsyncthay vì cp. Nó có một --progresslựa chọn.
frostschutz

2
Midnight Commandercũng hoạt động tốt và có giao diện người dùng dựa trên văn bản khá đẹp với các thanh tiến trình, nhưng có thể không được cài đặt. Hãy thử mctrên dấu nhắc lệnh. Ngoài ra, rõ ràng là không cp.
CVn

3
Sử dụng rsyncvới --progresschỉ làm cho tôi tìm ra những gì đang xảy ra. Nó bị kẹt khi đạt đến 100%, và sau đó kéo dài một vài phút cuối cùng. Tôi nghĩ điều tương tự đang xảy ra với nautilus. Dù sao đó là một câu hỏi khác, vì vậy câu trả lời tốt nhất cho câu hỏi này là rsync --progress, nó hiển thị kích thước,%, tốc độ và thời gian trôi qua.
yzT

2
một vấn đề với rsync là nó chạy chậm hơn bản sao thuần túy. Trên máy chủ lớn của tôi, sự khác biệt lần lượt là 60MB / s và 300MB / s.
pdwalker

1
@pdwalker ngay cả với -Wtùy chọn? trên tất cả các máy chủ của tôi rsyncgần như nhanh như cp... rất gần, tôi thường xuyên sử dụng rsyncthay vì cp.
Skaperen

Câu trả lời:


193

rsynccó một cờ được gọi là progress2hiển thị tỷ lệ phần trăm tổng thể:

rsync --info=progress2 source dest

5
--info = Progress2 vẫn chưa biến nó thành một kho lưu trữ mặc định và đây là năm 2015. Có vẻ như là một ý tưởng hay.
Lonniebiz

1
--info=progress2cuối cùng bao gồm trên version 3.1.0 protocol version 31. Có lẽ bạn có thể chỉnh sửa câu trả lời của mình, yzT.
Sopalajo de Arrierez

1
Tôi nhận thấy từ --info=progress2rsync đó là nhanh chóng! 200 MB / s, trong khi Windows không vượt quá 90 MB / s!
ReneFroger

1
@ReneFroger mặc dù đó có thể là tốc độ thực (tùy thuộc vào thiết bị), nhưng trong Linux, tốc độ nhanh là sai và sau khi sao chép xong, hệ thống vẫn ghi vào thiết bị, không giống như trong Windows mà bạn có thể đẩy thiết bị ra gần như ngay lập tức. Nếu bạn sao chép các tệp lớn, bạn có thể nhận thấy cách nó bắt đầu với tốc độ nhanh đó nhưng sau đó nó sẽ giảm xuống cho đến tệp chuẩn.
yzT

7
nó làm việc cho tôi chỉ với --progress. phiên bản rsync 3.0.9
adrianTNT

103

Nếu bạn cho phép các công cụ khác ngoài cpnó chắc chắn có thể. Đối với một tập tin duy nhất bạn có thể sử dụng pv. Đó là một công cụ nhỏ cung cấp số liệu thống kê tốt đẹp.

pv inputfile > outputfile

Nếu bạn có nhiều tệp hoặc thư mục, bạn có thể sử dụng tar:

tar c sourceDirectory | pv | tar x -C destinationDirectory

Bạn có thể bọc nó trong một chức năng vỏ. Nó ít để gõ và bạn có được ngữ nghĩa gần với ngữ nghĩa của cp. Đây là một chức năng rất đơn giản (và không có lỗi!):

cpstat () {
  tar c "$1" | pv | tar x -C "$2"
}

Lưu ý rằng một số phiên bản tarkhông hỗ trợ cú pháp nêu trên (ví dụ Solaris tar) và bạn phải sử dụng biến thể sau:

cpstat () {
  tar cf - "$1" | pv | (cd "$2";tar xf -)
}

Bạn gọi nó như thế này

cpstat sourceDirectory destinationDirectory

Bạn có thể nâng cao nó hơn nữa, để pvcung cấp ước tính thời gian còn lại.

Một giải pháp khác (như frostschutz đã đề cập trong một bình luận) là sử dụng rsync với --progresstùy chọn:

rsync --progress -a sourceDirectory destinationDirectory

1
cpstat đang diễn ra trong pastebin =)
Matt

7
Điều này sẽ cung cấp cho bạn tốc độ truyền, nhưng không phải ETA, vì pvkhông biết bao nhiêu dữ liệu sẽ đi qua đường ống. Bạn có thể chỉ định điều này bằng cách sử dụng -s. Ví dụ, trước tiên hãy làm du -sh sourceDirectoryđể có được một ý tưởng (thô), và sau đó chuyển nó đến pv, như thế này : pv -s 100m.
Jan Fabry

1
--info = Progress2 cung cấp cho bạn số liệu thống kê tiến độ cấp thư mục.
AlexLordThorsen

vbuf(debian, ubfox) nhanh hơn một chút pv, có lẽ là do bộ đệm vòng ảo của nó
Skaperen

@Skaperen tôi không biết vbuf. Nhưng có vẻ như hiện tại nó không ổn định trong Debian và do đó thường không có sẵn trên các Máy chủ thường chạy Debian ổn định.
Marco

58

rsync hoạt động tốt nhất để hiển thị tiến trình trong quá trình sao chép.

Ví dụ:

rsync -avh --progress sourceDirectory destinationDirectory

27

Như đã giải thích trong các câu trả lời khác, cp không cung cấp chức năng đó. Tuy nhiên, tiến trình (trước đây gọi là cv) là một công cụ nhỏ rất hữu ích trong việc cung cấp tính năng còn thiếu này.

Công cụ này có thể được mô tả như một lệnh Tiny Dirty Linux duy nhất tìm kiếm các lệnh cơ bản của coreutils (cp, mv, dd, tar, gzip / gunzip, cat, ...) hiện đang chạy trên hệ thống của bạn và hiển thị phần trăm sao chép dữ liệu.

Tôi đã sử dụng nó trong vài tháng qua và nó rất ổn định.


dường như không hoạt động với tất cả các hệ thống tập tin (ví dụ như cif) nhưng +1, không biết lối thoát ting điên rồ như vậy
akostadinov

1
Lưu ý rằng dự án này hiện được gọi là "tiến trình - Coreutils Progress Viewer (trước đây gọi là cv)".
chappjc

17

Có thể thấy tốc độ cp và phần trăm được sao chép?

Có, có thể hiển thị tiến trình của lệnh cptrên thiết bị đầu cuối.


Phương pháp # 1: (sử dụng progress)

Mở một thiết bị đầu cuối mới và gõ progressnó sẽ hiển thị tiến trình của cplệnh và các lệnh khác như:

cp, mv, dd, tar, cat, rsync, grep, fgrep, egrep, cut, sort, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, adb, gzip, gunzip, bzip2, bunzip2, xz, unxz, lzma, unlzma, 7z, zcat, bzcat, lzcat, split, gpg

Nếu bạn không cài đặt progress, bạn có thể cài đặt nó từ kho lưu trữ, ví dụ như trong CentOSlệnh này : yum -y install progress.

Sau đó, sau khi bạn chạy cplệnh trong nền hoặc sau khi chạy cpbình thường, hãy mở một thiết bị đầu cuối khác, vì vậy hãy thử lệnh này:

# progress -m

Xem đầu ra:

[30904] cp /home/user/file.mp4
        2.3% (200.9 MiB / 8.4 GiB) 3.6 MiB/s remaining 0:38:58

Phương pháp # 2: (sử dụng bản vá cp)

Hoặc tải xuống GNU coreutilsvà vá nó.

cd /tmp
wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz
tar -xvJf coreutils-8.21.tar.xz
cd coreutils-8.21
wget https://raw.githubusercontent.com/atdt/advcpmv/master/advcpmv-0.5-8.21.patch
patch -p1 -i advcpmv-0.5-8.21.patch

Chạy:

export FORCE_UNSAFE_CONFIGURE=1
./configure
make

Sao chép hai tập tin cpmvloacated dưới coreutils-8.21/src/để /usr/local/bin:

cp src/cp /usr/local/bin/cp
cp src/mv /usr/local/bin/mv

Hoặc sao chép nó bằng trình quản lý tệp của bạn dưới quyền root

Thêm các dòng sau vào ~/.bashrc:

alias cp='cp -gR'
alias mv='mv -g'

Đăng xuất và đăng nhập

Thanh tiến trình có thể được hiển thị mà không có –ghoặc –progress-bartheo khuyến nghị của Tác giả

Xem đầu ra:

0 files copied so far...                                              194.4 MiB /   8.4 GiB
[||--------------------------------------------------------------------------------]  2.3 %
Copying at   3.3 MiB/s (about 0h 5m 47s remaining)
/home/user/file.mp4                                                   194.4 MiB / 446.1 MiB
[||||||||||||||||||||||||||||||||||||----------------------------------------------] 43.6 %

Nguồn: linuxhelp


1
Điều này trông giống như nguồn gốc thực sự của cpbản vá: web.archive.org/web/20131115171331/http://beatex.org/web/ Kẻ
Kaushal Modi

1
+1 cho gợi ý về progresslệnh
Peter

đây là câu trả lời thực sự duy nhất
Alessio

14

Thông báo bài đăng này là hơi cũ. Nhưng khi tôi đưa ra giải pháp cho vấn đề này, tôi nghĩ tôi sẽ đăng giải pháp của mình.

Kịch bản: Chúng tôi có một cấu trúc thư mục rất lớn mà chúng tôi muốn sao chép, vì vậy chúng tôi ban hành lệnh cp -R sourcedir Destdir trong một cửa sổ đầu cuối.

Mở một cửa sổ đầu cuối khác hoặc đẩy quá trình xuống nền (Ctrl+Z,bg<CR>), sau đó hãy tạo một chỉ báo tiến trình theo cách ghetto:

Trước tiên chúng tôi nhận được tổng kích thước của cấu trúc thư mục mà chúng tôi muốn sao chép, bạn thực hiện việc này với:

du -sh /path/sourcedirectory/

Chuyển đổi kết quả thành gigabyte (G), sau đó thay thế n cho kết quả bạn nhận được trong biến nguồn. Khi bạn đã chèn nguồn và Destdir (thư mục đích), hãy chạy lệnh bên dưới.

while true; do sourcesize=n destdir=/path/destinationdirectory/ copyprogress="$(export | du -sh $destdir | awk '{print $1}' | sed 's/[^0-9.]*//g' )" ; echo "scale=3 ; $copyprogress / $sourcesize * 100" | bc | xargs echo -n ; echo % completed ; sleep 10 ; done

Điều này sẽ in tiến trình cứ sau 10 giây với các thông báo như:

0.100% completed
0.200% completed
0.300% completed 
... etc

Tôi biết rằng giải pháp này không giải quyết được tốc độ sao chép, nhưng có thể thêm nó bằng cách mở rộng các lệnh ở trên, có thể biến nó thành tập lệnh bash để dễ đọc hơn. Ví dụ, bằng cách kiểm tra bao nhiêu dữ liệu được sao chép pr. n đơn vị thời gian, tốc độ nên tầm thường để tính toán và hiển thị.


Điều này thực sự hoàn hảo cho trường hợp sử dụng của tôi, vì vậy cảm ơn bạn đã đăng nó! Tôi muốn biết về tiến trình sao chép một thư mục khổng lồ với hàng ngàn tệp chứ không chỉ một tệp, vì vậy các giải pháp khác không thực sự giúp tôi.
Ibrahim

Điều này thật tuyệt vời, đặc biệt là trong các trường hợp như tôi đang gặp phải ngay bây giờ: Từ xa đã bắt đầu một công việc mv khổng lồ để di chuyển hàng loạt bản sao lưu từ kho lưu trữ này sang kho lưu trữ khác, mà không cần suy nghĩ về các tác động trước đó. Bây giờ tôi có thể dễ dàng làm nền cho quá trình và nhìn vào nó. Tuyệt vời!
Riley

8

Để cải thiện câu trả lời của Marco, hôm nay tôi đã viết phiên bản này cpstat, vì vậy bạn có thể sao chép nhiều thư mục và sử dụng tham số cuối cùng làm đường dẫn đích. Lưu ý rằng nếu bạn sử dụng đường dẫn sâu tương đối làm nguồn, bạn có thể tartự động tạo cùng một cây thư mục phụ thuộc.

function cpstat () {

    tar -cf - "${@: 1: $#-1}" |
    pv -s "$( du -cs -BK --apparent-size "${@: 1: $#-1}" |
              tail -n 1 |
              cut -d "$(echo -e "\t")" -f 1)" |
    ( cd "${@: $#}"; tar -xf - )

;}

6

Không phải trong một phiên bản tiêu chuẩn của cp.

Bạn có thể đặt nền cp và liệt kê kích thước trong khi chờ cpkết thúc.

Tôi sử dụng perl này để theo dõi sự tăng trưởng của một tệp nhưng nó chạy bên ngoài tới cp (hoặc bất cứ điều gì khác tôi đang làm)



5

Mặc dù rsyncsẽ cung cấp cho bạn một số thống kê tiến độ, nếu bạn muốn một thanh tiến trình bạn nên sử dụng pv.

Bạn có thể sử dụng cpv, một trình bao bọc cho pvmột cú pháp dễ dàng hơn, tương tự như trình bao bọc cpmà bạn có thể sử dụng để sao chép các thư mục đệ quy

nhập mô tả hình ảnh ở đây

Bạn có thể lấy nó ở đây


+1 cho gợi ý về pv. Đẹp tìm thấy!
Peter

4

Sử dụng một công cụ như mc(chỉ huy nửa đêm) có thể là một lựa chọn thay thế tốt cho các câu trả lời khác.

Đây là một trình quản lý tệp đơn giản cho thấy bạn sao chép / di chuyển tiến trình.



4

Một giải pháp đơn giản khác là chỉ xem thư mục đầu ra như sau:

Linux / Cygwin: watch -n 10 --differences du -sk --apparent-size <WATCHED_FOLDER>

FreeBSD: gnu-watch -n 10 --differences du -sk <WATCHED_FOLDER>

Tiện ích tiện dụng này sẽ chạy du và làm nổi bật sự khác biệt.

Một giải pháp tiềm năng khác là viết một kịch bản đơn giản lặp lại, gọi duvà đưa ra một ước tính sơ bộ về thông lượng.


3

Công cụ này là một lệnh tiện ích Linux tìm kiếm các lệnh cơ bản của coreutils (cp, mv, dd, tar, gzip / gunzip, cat, v.v.) hiện đang chạy trên hệ thống của bạn và hiển thị phần trăm dữ liệu được sao chép:

https://github.com/Xfennec/cv


1
Điều này đã được đề xuất bởi @AmrMostafa vào 14/11.
Dubu

2

Tôi vừa gặp trường hợp cp bị chặn ít nhiều do lỗi FUSE trong hệ thống tập tin nhận.

Nếu bạn không thể chuyển từ cp (tức là vì --spzzy = always) và muốn một cái gì đó thực sự đáng tin cậy cho tiến trình, hãy đi qua / Proc.

Every 2.0s: cat /proc/20977/io                                                      Thu Sep 28 04:08:57 2017

rchar: 268573800
wchar: 268500992
syscr: 4112
syscw: 4097
read_bytes: 268697600
write_bytes: 0
cancelled_write_bytes: 0

0

VCP - sao chép các tệp trong giao diện nguyền rủa (Hiển thị Thanh tiến trình trong Linux).

SỰ MIÊU TẢ: vcp sao chép các tập tin và thư mục trong giao diện nguyền rủa, với đầu ra chỉ có văn bản. các tùy chọn và đầu ra của nó tương tự như cp của BSD trong khi thêm một số tính năng mới.

Nó cung cấp thông tin về:

  • các tập tin được sao chép và để lại để sao chép
  • dữ liệu được viết và tổng kích thước dữ liệu
  • dữ liệu được ghi mỗi giây
  • hai thanh trạng thái, một thanh hiển thị trạng thái tệp hiện tại, tổng trạng thái khác (ngoại trừ 1 tệp, cả hai hiển thị hiện tại) và tỷ lệ phần trăm

khi đầu ra được gửi đến bàn điều khiển:

  • một thanh trạng thái
  • kích thước sao chép và tốc độ

Trang người đàn ông VCP: https://linux.die.net/man/1/vcp

Tải xuống vcp-2.2.tar.gz từ:

http://distfiles.gentoo.org/distfiles/vcp-2.2.tar.gz

Phụ thuộc: curses.h (libncurses-dev).

Trên Ubuntu, cài đặt:

sudo apt-get install libncurses-dev

hoặc là

sudo apt-get install libncurses5-dev

CÀI ĐẶT vcp:

make && make install

Hướng dẫn sử dụng:

man vcp
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.