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 cp
lệnh trên gentoo đã có một -g
chuyển đổi cho thấy sự tiến bộ.
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 cp
lệnh trên gentoo đã có một -g
chuyển đổi cho thấy sự tiến bộ.
Câu trả lời:
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/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"
sau đó bạn chỉ cần nói mvg bigfile /mnt/backup
và trực tiếp nhận thanh tiến trình.
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 -P
cô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
bar
là 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.
bar
chưa gói mv
.
rsync
hoà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
.
Có một công cụ mới được 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
progress
sau khi cài đặt và nó cho tôi thấy tiến trình cho mv
lệnh mà tôi hiện đang chờ đợi. Cảm ơn!
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
watch progress -w
bạn cũng có thể chỉ cần sử dụngprogress -m
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 gzip
và tar
). 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
vậy. Tuy nhiên, sao chép không phải pv
là 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 mv
thay thế, 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.
tar cf - source-dir | pv | tar xf - -C out-dir
sẽ 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 -s
pv, nó cũng có thể cung cấp cho bạn sự tiến bộ.
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.
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 $src
khô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 -r
cuối cùng là cần thiết vì --remove-source-files
chỉ 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à -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ộ 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=progress2
cho thấy tiến trình cho toàn bộ hoạt động.
Để tránh vá coreutil để thêm thanh tiến trình vào mv
và cp
, 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ư cp
với các tùy chọn -r
cho đệ quy và -v
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 đượ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/
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 -sm
tậ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 df
lại và xem bao nhiêu tệp đã được sao chép.
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ề
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
gcp
khô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.
Đ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 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%
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.
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 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
sau 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
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.