it-swarm-vi.com

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)?

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? Lệnh cp trên gentoo có -g chuyển đổi cho thấy sự tiến bộ.

129
letronje

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à bản vá lỗi 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/backup và sử dụng mv bình thường.

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

50
fschmitt

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 : Rupync sao chép các tệp và có -P chuyển sang 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 : Tập lệnh 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 :

‘Bar, -’ cat, với ASCII thanh tiến trình

bar là tập lệnh Shell nhỏ để hiển thị 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ủ dự án.

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

96
echox

Có một công cụ mới gọi là progress 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 độ: 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

92
naugtur

Bạn có thể sử dụng trình xem đường ống lệnh pv để 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ư cp. Tuy nhiên, sao chép không phải là mục đích của pv. 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.

Tùy chọn tốt hơn nhiều là sử dụng rsync -aP. Thay vào đó, nếu bạn muốn mv, hãy gắn cờ --remove-source-files. Thêm phần này vào .bashrc Nế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.

36
Lamnk

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.

6
Christian Madsen

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

Bảo đảm $src does không kết thúc bằng dấu gạch chéo ngược, nếu không, bạn sẽ có nghĩa khác với GNU cp.

Các rm -r ở cuối là cần thiết vì --remove-source-files chỉ xóa các tệp nguồn, sau khi mỗi tệp được sao chép thành công, không phải các thư mục. Các && đảm bảo chỉ chạy nếu rsync hoàn thành 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 {} +

Sự cố duy nhất là -P tùy chọn hiển thị tiến trình cho mỗi tệp, không phải cho toàn bộ thao tác sao chép. Điều này có thể vô ích nếu bạn đang cố 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=progress2 cho thấy sự tiến bộ cho toàn bộ hoạt động.

4
Tobia

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 đó là một bản sao dài, tôi thực hiện du -sm Trên các tệp và df -m | grep copy_to_partition. Sau đó, nếu tò mò tôi sẽ mất thêm bao nhiêu thời gian nữa để thực hiện df và xem bao nhiêu tệp đã được sao chép.

2
HandyGandy

Điều này không cung cấp cho bạn một thanh tiến trình, nhưng nhấn CTRL-T và bạn sẽ gửi một 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 trong bao lâu. 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%
2
Charles

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 (thực sự rất hay)

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

2
ThePentadactyl

Để 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 cùng một cách như cp với các tùy chọn -r cho đệ quy và -v cho tí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 đã sao chép trong nhật ký, xem phần phần 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/

2
Yves Martin

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 tập tin hiệu ứng).

Bạn sẽ cần pv (trình xem ố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 mv trê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 target theo dõi bởi 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 tại đây để biết thêm chi tiết: thông tin tiến trình qua pv để sao chép thư mục

1
lesmana

Lúc nào tôi cũng tìm kiếm câu trả lời này sa 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 đang ở 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 không để giết 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.

1
qazmonk

Tôi sử dụng tập lệnh sau được lưu với rsmv name:

#!/usr/bin/env bash

rsync -aP --remove-source-files "[email protected]" && rm -rf "${@:1:$#-1}"

Nó xử lý nhiều hơn một nguồn và tên tệp với khoảng trắng:

$ rsmv source1 source2 source\ 3 "source 4" dest
0
mixel