Làm cách nào tôi có thể di chuyển tệp và xem tiến trình (ví dụ: với thanh tiến trình)?


118

Khi di chuyển các thư mục lớn bằng cách sử dụng mv, có cách nào để xem tiến trình (%) không? Các cplệnh trên gentoo đã có một -gchuyển đổi cho thấy sự tiến bộ.


3
Đo thông lượng đường ống trong vỏ có thể giúp ích, mặc dù tôi không biết liệu có thể dễ dàng sử dụng các công cụ đó khi di chuyển tệp hay không
Michael Mrozek

Câu trả lời:


50

Bạn có thể xây dựng một cp và mv được vá, sau đó cả hai đều hỗ trợ chuyển đổi -g để hiển thị tiến trình. Có hướng dẫn và các bản vá tại trang này . Tuy nhiên : Trang hướng dẫn bạn làm

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

ghi đè lên cp gốc và mv. Điều này có hai nhược điểm: Thứ nhất, nếu gói coreutils được cập nhật đến hệ thống của bạn, chúng sẽ bị ghi đè. Thứ hai, nếu phiên bản vá có vấn đề, họ có thể phá vỡ các tập lệnh dựa trên cp và mv tiêu chuẩn. Tôi thà làm một cái gì đó như thế này:

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

sao chép các tệp vào / usr / local / bin dành cho các chương trình do người dùng biên dịch và đặt cho chúng một tên khác. Vì vậy, khi bạn muốn một thanh tiến trình, bạn nói mvg -g bigfile /mnt/backupvà sử dụng mv bình thường.

Ngoài ra bạn có thể làm alias mvg="/usr/local/mvg -g"sau đó bạn chỉ cần nói mvg bigfile /mnt/backupvà trực tiếp nhận thanh tiến trình.


2
Thật không may, bản vá trên trang này Trang này không còn tồn tại và dường như không được lập chỉ mục trong Lưu trữ web. Dường như có nhiều bản vá với tên và chức năng tương tự , bạn có thể chỉnh sửa câu trả lời của mình để làm rõ ý bạn muốn nói không?
Gilles

Tôi nghĩ github.com/atdt/advcpmv là một người kế thừa hợp lệ và nó có cùng một bản vá nên tôi đã thay đổi liên kết để trỏ đến nó.
fschmitt

93

Tôi không thích ý tưởng ghi đè nhị phân từ coreutil khi có các giải pháp đơn giản hơn, vì vậy đây là của tôi:

rsync : Rsync sao chép các tập tin và có một -Pcông tắc cho một thanh tiến trình. Vì vậy, nếu bạn đã cài đặt rsync, bạn có thể sử dụng một bí danh đơn giản trong shellfile của mình:

alias cp='rsync -aP'

Nhược điểm là, rsync chậm hơn một chút so với cp, nhưng bạn nên đo lường điều này theo thời gian và tự quyết định, tôi có thể sống với nó :-)

Shell Script : Một kịch bản shell cũng có thể tạo thanh tiến trình. Tôi đã tìm thấy điều này một thời gian trước trên mạng và tôi không nhớ nguồn:

#!/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% [===============================>                      ]

thanh :

'thanh' - 'mèo' với thanh tiến trình ASCII

barlà một tập lệnh shell nhỏ để hiển thị một thanh quy trình cho tất cả các loại hoạt động (cp, tar, v.v.). Bạn có thể tìm thấy các ví dụ trên trang chủ của dự án.

Nó cũng được viết cho vỏ bourne, vì vậy nó sẽ chạy gần đó ở mọi nơi.


3
barchưa gói mv.
Tobu

5
Tín dụng cho kịch bản shell
Lamnk

1
Lưu ý rằng rsynchoàn toàn không thay thế mv(OP đang hỏi về), đặc biệt là khi nói đến các bản sao nhanh trên các hệ thống tệp sao chép khi ghi như thế nào btrfs.
Karl Richter

74

Có một công cụ mới được gọi là progresscó 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 độ: có sẵn tại đây

progress -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


3
WOW, tôi không ngờ điều này lại tuyệt vời đến thế! Tôi chỉ cần gõ progresssau khi cài đặt và nó cho tôi thấy tiến trình cho mvlệnh mà tôi hiện đang chờ đợi. Cảm ơn!
jredd

3
Cảm ơn! Khi di chuyển công cụ như một root, có vẻ như bạn phải sử dụng sudo(cùng một người dùng tôi đoán) - bạn cũng có thể sử dụng watchđể nói những gì đang xảy ra cứ sau 2 giây:watch progress -w
Wilf

6
Chương trình tuyệt vời, nhưng khi di chuyển, ví dụ như một thư mục có nhiều tệp, nó chỉ hiển thị tiến trình của tệp hiện tại, chứ không phải toàn bộ thư mục. Thay vì watch progress -wbạn cũng có thể chỉ cần sử dụngprogress -m
mxmlnkn

6
IMHO, đây là cách đơn nhất để giải quyết vấn đề. Thay vì vá coreutils hoặc sử dụng các công cụ không được chỉ định cho các mục đích cụ thể (như rsync cho mv) hoặc viết các tập lệnh quá mức, chỉ cần sử dụng công cụ đó được viết cho mục đích chủ đề với tình yêu.
Đau buồn

34

Bạn có thể sử dụng lệnh xem ốngpv để hiển thị thanh tiến trình:

pv /original/file > /new/file

Tôi thường sử dụng điều này để sao chép một tệp lớn qua hệ thống tệp mạng được gắn kết (kết hợp với gziptar). Hạn chế là bạn chỉ có thể sao chép một tệp chứ không phải thư mục. Và bạn phải đặt tên cho tệp mới, bạn không thể chỉ cung cấp thư mục đích như cpvậy. Tuy nhiên, sao chép không phải pvlà mục đích. Nó là một công cụ mạnh mẽ và làm được nhiều việc hơn là chỉ sao chép tập tin. Xem trang chủ để biết thêm ví dụ về pv.

Một lựa chọn tốt hơn nhiều là sử dụng rsync -aP. Nếu bạn muốn mvthay thế, hãy gắn cờ --remove-source-files. Thêm phần này vào .bashrcnếu bạn muốn sử dụng các lệnh thường xuyên:

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

Nhược điểm ở đây là rsync chỉ hiển thị tiến trình, không phải là thanh tiến trình.


tar cf - source-dir | pv | tar xf - -C out-dirsẽ cung cấp cho bạn thông lượng của toàn bộ thư mục. Nếu bạn biết kích thước và vượt qua -spv, nó cũng có thể cung cấp cho bạn sự tiến bộ.
arantius

6

Nếu mục tiêu của bạn là di chuyển / sao chép một thư mục bằng thanh tiến trình, nhưng tránh GUI không đầu cuối, mc (Midnight Commander) là một lựa chọn tốt.


3

Giải pháp của tôi là sử dụng rsync. Nó có thể sao chép các thư mục, xóa các tệp nguồn sau khi sao chép thành công (do đó "di chuyển" chúng) và hiển thị các báo cáo tiến trình, trong số nhiều tính năng khác (đáng chú ý nhất là đồng bộ hóa các thư mục được sao chép một phần và hoạt động qua mạng.)

Đây là cách tôi sẽ di chuyển một thư mục với rsync, với báo cáo tiến độ:

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

Hãy chắc chắn rằng $srckhông phải kết thúc bằng một dấu gạch chéo, nếu không bạn sẽ nhận được một ý nghĩa khác nhau hơn so với GNU cp.

Các rm -rcuối cùng là cần thiết vì --remove-source-fileschỉ loại bỏ các tập tin nguồn, sau khi mỗi người đều được sao chép thành công hơn, không phải là thư mục. Các &&đảm bảo để chạy nó chỉ nếu rsync hoàn tất thành công. Nếu bạn bị hoang tưởng, bạn có thể thay thế nó bằng một loại đệ quy rmdir, chẳng hạn nhưfind $src -d -exec rmdir {} +

Vấn đề duy nhất là -Ptùy chọn hiển thị tiến trình cho mỗi tệp, không phải cho toàn bộ hoạt động sao chép. Điều này có thể vô ích nếu bạn đang cố gắng di chuyển một thư mục có nhiều tệp nhỏ. Phiên bản phát triển mới nhất của rsync có cờ thay thế --info=progress2cho thấy tiến trình cho toàn bộ hoạt động.


2

Để tránh vá coreutil để thêm thanh tiến trình vào mvcp, gcp(Goffi's CoPier) là một thay thế mới: http://wiki.goffi.org/wiki/Gcp/en

Để sử dụng tương tự như cpvới các tùy chọn -rcho đệ quy và -vtính dài dòng.

Nó sử dụng một hàng đợi tệp khi nhiều lệnh được gọi đồng thời. Nó cũng cho phép ghi lại tên tệp được sao chép trong nhật ký, xem phần Trang tiết kiệm nguồn để biết chi tiết.

Đây là một hướng dẫn tốt để bắt đầu với gcp: http://mylinuxbook.com/gcp-advified-command-line-file-copier-inspired-by-cp/


Có gmv như gcp cho cp không?
CodyChan

Tôi đã tìm thấy không có tương đương. Nhân tiện, không cần thanh tiến trình khi chạy "mv" trên một hệ thống tệp duy nhất ... nó khá nhanh. Nếu di chuyển được thực hiện trên hai hệ thống tệp khác nhau, nó được triển khai dưới dạng cp và sau đó xóa nguồn nếu thành công hoặc xóa mục tiêu nếu thất bại. Một tập lệnh shell đơn giản dựa trên gcp có thể thực hiện đúng (với lần kiểm tra đầu tiên để biết liệu nguồn và đích có thực sự trên các hệ thống tệp khác nhau hay không)
Yves Martin

2

Trước hết: Tôi không bao giờ sao chép các tệp lớn mà không sử dụng ionice, trừ khi tôi biết rằng tôi sẽ không muốn sử dụng máy tính trong nửa giờ trở lên.

Thứ hai: tất cả các phân vùng của tôi được ghép lại để sao chép nội suy không mất thời gian. Nếu nó là một bản sao dài, tôi làm một du -smtập tin và df -m | grep copy_to_partition. Sau đó, nếu tò mò mất bao nhiêu thời gian tôi sẽ làm dflại và xem bao nhiêu tệp đã được sao chép.


Bạn có quan tâm để chia sẻ lời khuyên ionice của bạn? bạn ưu tiên gì cho mv cpu-khôn ngoan và đĩa i / o khôn ngoan? Dưới đây là các cài đặt của tôi nhưng tải CPU vẫn ở mức cao ngay cả sau khi đổi tên: imgur.com/a/DLMJplz
ychaouche

2

Trên Mint của tôi, tôi thích sử dụng gcp cho giải pháp này hoặc giải pháp curl (rất tốt)

gcp SOURCE DESTINATION

Bạn có thể cần phải cài đặt nó sudo apt-get install gcp

Và một nhiệm vụ rất hay và tuyệt vời cho thanh tiến trình với thông tin về

  • % Toàn bộ
  • % Nhận
  • % Xferd
  • DL trung bình
  • Tốc độ tải lên
  • Thời gian còn lại
  • Thời gian sử dụng
  • Tổng thời gian
  • Tốc độ hiện tại

trong một định dạng dễ đọc là:

curl -o DESTINATION FILE://source

Ngoài ra, bạn có thể cần phải cài đặt nó trước sudo apt-get install curl


gcpkhông hỗ trợ di chuyển tệp, tức là các tệp nguồn phải được xóa thủ công sau khi sao chép thành công.
Karl Richter

2

Điều này không cung cấp cho bạn một thanh tiến trình, nhưng nhấn CTRL-Tvà bạn sẽ gửi SIGINFOđến mv, nó sẽ báo cáo tập tin nào đang hoạt động và quá trình thực hiện. Khá tiện lợi để có điều này để chuyển tập tin lớn, có thể không hữu ích cho việc chuyển với nhiều tệp nhỏ.

Ví dụ nhanh:

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
Điều này không hiệu quả với tôi: Tôi hiểu INFO: unknown signal; killall -l lists signals. rằng SIGINFO chỉ có trên một số BSD, không có trong POSIX tiêu chuẩn.
Brian Minton

2
Đúng. Nó không hoạt động trong Mac OS X, nhưng có khả năng không phải là Ubuntu.
Charles

1

Sử dụng mv -vđể in một dòng trên mỗi tệp được di chuyển và pv -lđể in tiến trình dựa trên số dòng (tính theo số hiệu ứng).

Bạn sẽ cần pv(trình xem đường ống): http://www.ivarch.com/programs/pv.shtml

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

Sử dụng lệnh sau để lấy số tập tin:

find sourcedir | wc -l

Lệnh này sẽ hiển thị thông tin tiến trình dựa trên số lượng tệp được sao chép. Điều này hoạt động tốt nhất nếu có nhiều tập tin nhỏ. Nếu chỉ có một vài tệp rất lớn thì bạn sẽ không có nhiều niềm vui.

Lưu ý rằng mvtrên cùng một phân vùng phải nhanh. mvđến một phân vùng khác sẽ giống như cp source targetsau rm source. Vì vậy, đây là hai lệnh để sao chép thư mục với thông tin tiến trình.

để báo cáo tiến trình dựa trên số lượng tệp được sao chép:

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

để báo cáo tiến trình dựa trên byte được sao chép:

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

Xem ở đây để biết thêm chi tiết: thông tin tiến bộ qua pv để sao chép thư mục


1

Lúc nào tôi cũng tìm kiếm câu trả lời này sau khi tôi bắt đầu lệnh 'mv', tại thời điểm đó tôi không muốn bắt đầu lại. Nếu bạn ở trong tình huống này, một cách rất đơn giản để theo dõi tiến trình (hoặc để xem liệu nó có đủ xa để giết không) hay không: là chạy:

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

Điều này sẽ chỉ in kích thước của thư mục để bạn có thể xem lượng dữ liệu đã được sao chép hoặc bạn có thể chạy nó một vài lần để xem dữ liệu được truyền nhanh như thế nào.

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.