เป็นไปได้ไหมที่จะเห็นความเร็ว cp และเปอร์เซ็นต์การคัดลอก


251

ฉันมีปัญหาเมื่อคัดลอกไฟล์ขนาดใหญ่โดยใช้หอยโข่ง (ติดอยู่) cpฉันต้องคัดลอกโดยใช้ ฉันต้องการทราบว่ามีพารามิเตอร์ใด ๆ ที่แสดง% คัดลอกและความเร็วในการถ่ายโอนหรือไม่


39
คุณสามารถใช้แทนrsync cpแต่ก็มี--progressตัวเลือก
frostschutz

2
Midnight Commanderยังใช้งานได้ดีและมี UI แบบข้อความที่สวยงามพร้อมแถบความคืบหน้า แต่อาจไม่ได้รับการติดตั้ง ลองใช้mcพรอมต์คำสั่ง cpนอกจากนี้ยังเห็นได้ชัดว่ามันไม่ได้
CVn

3
ใช้rsyncมี--progressเพียงแค่ทำให้ฉันคิดออกสิ่งที่เกิดขึ้น มันติดเมื่อถึง 100% และจากนั้นในไม่กี่นาทีสุดท้าย ฉันคิดว่าเหมือนกันกับสิ่งที่เกิดขึ้นกับหอยโข่ง อย่างไรก็ตามนั่นเป็นคำถามอื่นแล้วดังนั้นคำตอบที่ดีที่สุดสำหรับคำถามนี้คือrsync --progressมันแสดงขนาด,%, ความเร็วและเวลาที่ผ่านไป
yzT

2
ปัญหาอย่างหนึ่งของ rsync คือมันทำงานช้ากว่าสำเนาแท้ บนเซิร์ฟเวอร์ขนาดใหญ่ของฉันความแตกต่างคือ 60MB / s และ 300MB / s ตามลำดับ
pdwalker

1
@ pdwalker แม้มี-Wตัวเลือกหรือไม่ ในครอบครัวของฉันทั้งหมดrsyncเกือบจะเป็นอย่างรวดเร็วcp... เพื่อให้ใกล้เคียงผมใช้เป็นประจำแทนrsync cp
Skaperen

คำตอบ:


193

rsyncมีการตั้งค่าสถานะเรียกprogress2ซึ่งแสดงเปอร์เซ็นต์โดยรวม:

rsync --info=progress2 source dest

5
--info = progress2 ยังไม่ได้ทำให้มันกลายเป็นพื้นที่เก็บข้อมูลเริ่มต้นและนี่คือปี 2015 ดูเหมือนว่าเป็นความคิดที่ดี
Lonniebiz

1
--info=progress2version 3.1.0 protocol version 31ในที่สุดก็รวมอยู่ใน บางทีคุณสามารถแก้ไขคำตอบของคุณ yzT
Sopalajo de Arrierez

1
ฉันสังเกตเห็นจาก--info=progress2rsync ที่เห็นได้ชัดอย่างรวดเร็ว! 200 MB / s ในขณะที่ Windows มีขนาดไม่เกิน 90 MB / s!
ReneFroger

1
@ReneFroger แม้ว่ามันอาจจะเป็นความเร็วจริง (ขึ้นอยู่กับอุปกรณ์) แต่บ่อยครั้งใน Linux ที่ความเร็วที่รวดเร็วเป็นเท็จจริง ๆ และหลังจากที่การคัดลอกเสร็จสิ้นระบบยังคงเขียนไปยังอุปกรณ์ซึ่งแตกต่างจาก Windows ที่คุณสามารถนำอุปกรณ์ออกได้ เกือบจะในทันที หากคุณคัดลอกไฟล์ขนาดใหญ่คุณสามารถสังเกตเห็นว่ามันเริ่มต้นด้วยความเร็วที่รวดเร็ว แต่จากนั้นมันจะลงไปจนถึงไฟล์มาตรฐาน
yzT

7
--progressมันทำงานให้ฉันมีเพียง rsync เวอร์ชั่น 3.0.9
adrianTNT

103

หากคุณอนุญาตให้ใช้เครื่องมืออื่นนอกเหนือจากที่cpเป็นไปได้อย่างแน่นอน pvสำหรับไฟล์เดียวคุณสามารถใช้ มันเป็นเครื่องมือขนาดเล็กที่ให้สถิติที่ดี

pv inputfile > outputfile

หากคุณมีหลายไฟล์หรือไดเรกทอรีคุณสามารถใช้ tar:

tar c sourceDirectory | pv | tar x -C destinationDirectory

คุณสามารถห่อมันในฟังก์ชั่นเชลล์ cpมันน้อยพิมพ์และคุณได้รับความหมายใกล้เคียงกับคนของ นี่เป็นฟังก์ชั่นที่ง่ายมาก (และไม่ใช่ข้อผิดพลาด!):

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

โปรดทราบว่าบางรุ่นtarไม่รองรับไวยากรณ์ข้างต้น (เช่น Solaris tar) และคุณต้องใช้ตัวแปรต่อไปนี้:

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

คุณเรียกว่าแบบนี้

cpstat sourceDirectory destinationDirectory

คุณสามารถปรับปรุงให้ดียิ่งขึ้นเพื่อpvให้การประมาณเวลาที่เหลืออยู่

โซลูชันอื่น (ตามที่ frostschutz พูดถึงในความคิดเห็น) คือการใช้ rsync กับ--progressตัวเลือก:

rsync --progress -a sourceDirectory destinationDirectory

1
cpstat กำลังไปใน pastebin =)
Matt

7
นี่จะทำให้คุณถ่ายโอนความเร็วได้ แต่ไม่ใช่ ETA เพราะpvไม่ทราบว่าจะมีข้อมูลมากแค่ไหนในท่อ -sคุณสามารถระบุนี้โดยใช้ เช่นครั้งแรกที่ทำdu -sh sourceDirectoryจะได้รับ (พท์คร่าวๆ) ความคิดและจากนั้นผ่านไปเช่นนี้pv pv -s 100m
Jan Fabry

1
--info = progress2 จะให้สถิติความคืบหน้าในระดับไดเรกทอรี
AlexLordThorsen

vbuf(เดเบียนอูบุนตู) เป็นบิตที่เร็วกว่าดีกว่าpvอาจเป็นเพราะบัฟเฟอร์วงแหวนเสมือนจริง
Skaperen

@Skaperen vbufผมไม่ทราบว่า แต่ดูเหมือนว่ามันจะอยู่ใน Debian ที่ไม่เสถียรในขณะนี้ดังนั้นจึงไม่สามารถใช้ได้บนเซิร์ฟเวอร์ซึ่งโดยปกติแล้วจะใช้ Debian เสถียร
มาร์โก

58

rsync ทำงานได้ดีที่สุดสำหรับการแสดงความคืบหน้าในระหว่างการคัดลอกความคืบหน้า

อดีต:

rsync -avh --progress sourceDirectory destinationDirectory

27

ตามที่อธิบายไว้ในคำตอบอื่น ๆ cp ไม่ได้จัดเตรียมการทำงานนั้น อย่างไรก็ตามความคืบหน้า (ก่อนหน้านี้เรียกว่า cv)เป็นเครื่องมือขนาดเล็กที่มีประโยชน์มากในการให้บริการคุณสมบัติที่ขาดหายไปนี้

เครื่องมือนี้สามารถอธิบายเป็นคำสั่ง Tiny Dirty Linux เท่านั้น * C ที่ค้นหาคำสั่งพื้นฐานของ coreutils (cp, mv, dd, tar, gzip / gunzip, cat, ... ) ที่กำลังทำงานบนระบบของคุณและแสดงเปอร์เซ็นต์การคัดลอก ข้อมูล.

ฉันใช้มันมาหลายเดือนแล้วและมันก็แข็ง


ดูเหมือนจะไม่ได้ทำงานกับระบบไฟล์ทั้งหมด (เช่น cifs) แต่ +1 ไม่ทราบว่าออกจากการใช้งานที่บ้าคลั่งอย่างนี้ได้อย่างไร
akostadinov

1
โปรดทราบว่าโครงการนี้เรียกว่า "ความคืบหน้า - Coreutils Progress Viewer (เดิมชื่อ cv)"
chappjc

17

เป็นไปได้ไหมที่จะเห็นความเร็ว cp และเปอร์เซ็นต์การคัดลอก

ใช่เป็นไปได้ที่จะแสดงความคืบหน้าของคำสั่งcpบนเทอร์มินัล


วิธีที่ # 1: (ใช้progress)

เปิดเทอร์มินัลใหม่แล้วพิมพ์progressมันจะแสดงความคืบหน้าของcpคำสั่งและคำสั่งอื่น ๆ เช่น:

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

หากคุณไม่ได้ติดตั้งprogressคุณสามารถติดตั้งได้จากพื้นที่เก็บข้อมูลเช่นในด้วยคำสั่งนี้CentOSyum -y install progress

จากนั้นหลังจากที่คุณรันcpคำสั่งในพื้นหลังหรือหลังจากรันcpตามปกติให้เปิดเทอร์มินัลอื่นดังนั้นให้ลองใช้คำสั่งนี้:

# progress -m

ดูผลลัพธ์:

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

วิธีที่ # 2: (ใช้โปรแกรมแก้ไขcp)

หรือดาวน์โหลด GNU coreutilsและทำการแก้ไข

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

วิ่ง:

export FORCE_UNSAFE_CONFIGURE=1
./configure
make

คัดลอกสองไฟล์cpและmvloacated ภายใต้coreutils-8.21/src/การ/usr/local/bin:

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

หรือคัดลอกโดยใช้ตัวจัดการไฟล์ของคุณเป็นรูต

เพิ่มบรรทัดต่อไปนี้ใน~/.bashrc:

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

ออกจากระบบและเข้าสู่ระบบ

แถบความคืบหน้าสามารถแสดงโดยไม่ต้อง–gหรือ–progress-barตามที่ผู้เขียนแนะนำ

ดูผลลัพธ์:

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 %

ที่มา: linuxhelp


1
ดูเหมือนแหล่งที่มาที่แท้จริงของcpแพทช์: web.archive.org/web/20131115171331/http://beatex.org/web/…
Kaushal Modi

1
+1 สำหรับคำใบ้เกี่ยวกับprogressคำสั่ง
ปีเตอร์

นี่เป็นคำตอบเดียวที่แท้จริง
Alessio

14

สังเกตเห็นการโพสต์นี้ค่อนข้างเก่า แต่เมื่อฉันได้แก้ไขปัญหานี้แล้วฉันคิดว่าฉันจะโพสต์โซลูชันของฉัน

สถานการณ์จำลอง: เรามีโครงสร้างไดเรกทอรีขนาดใหญ่มากที่เราต้องการคัดลอกดังนั้นเราจึงออกคำสั่ง cp -R sourcedir destdir ในหน้าต่างเทอร์มินัลเดียว

เปิดหน้าต่างเทอร์มินัลอื่นหรือผลักดันกระบวนการไปยังพื้น(Ctrl+Z,bg<CR>)หลังจากนั้นให้สร้างตัวบ่งชี้ความคืบหน้าแบบสลัม

ก่อนอื่นเราจะได้ขนาดทั้งหมดของโครงสร้างไดเรกทอรีที่เราต้องการคัดลอกคุณทำสิ่งนี้กับ:

du -sh /path/sourcedirectory/

แปลงผลลัพธ์เป็นกิกะไบต์ (G) จากนั้นแทนที่ n สำหรับผลลัพธ์ที่คุณได้รับในแหล่งที่มาของตัวแปร เมื่อคุณแทรก sourceize และ destdir (ไดเรกทอรีปลายทาง) ให้รันคำสั่งด้านล่าง

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

สิ่งนี้จะพิมพ์ความคืบหน้าทุกๆ 10 วินาทีด้วยข้อความที่ชอบ:

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

ฉันทราบว่าโซลูชันนี้ไม่ได้ระบุความเร็วในการคัดลอก แต่อาจเป็นไปได้ที่จะเพิ่มสิ่งนั้นโดยการขยายคำสั่งด้านบนอาจทำให้เป็นสคริปต์ทุบตีเพื่อให้อ่านง่ายขึ้น เช่นโดยการตรวจสอบจำนวนข้อมูลที่ถูกคัดลอกราคา n หน่วยเวลาความเร็วควรเป็นสิ่งสำคัญในการคำนวณและแสดงผล


นี่เป็นจริงที่สมบูรณ์แบบสำหรับกรณีการใช้งานของฉันดังนั้นขอขอบคุณสำหรับการโพสต์! ฉันต้องการทราบเกี่ยวกับความคืบหน้าในการคัดลอกไดเรกทอรีขนาดใหญ่ที่มีหลายพันไฟล์ไม่ใช่แค่ไฟล์เดียวดังนั้นโซลูชันอื่น ๆ ก็ไม่ได้ช่วยฉันจริงๆ
อิบราฮิม

นี่เป็นเรื่องที่ยอดเยี่ยมโดยเฉพาะอย่างยิ่งในกรณีเช่นที่ฉันกำลังประสบอยู่ในขณะนี้: เริ่มต้นงาน mv ขนาดใหญ่เพื่อย้ายเทราไบต์ของการสำรองข้อมูลจากพูลหน่วยเก็บข้อมูลหนึ่งไปยังอีกที่หนึ่งโดยไม่ต้องคำนึงถึงผลกระทบล่วงหน้า ตอนนี้ฉันสามารถพื้นหลังกระบวนการและมองเข้าไปในมัน น่ากลัว!
Riley

8

เพื่อปรับปรุงคำตอบของมาร์โกวันนี้ฉันเขียนเวอร์ชันนี้cpstatเพื่อให้คุณสามารถคัดลอกไดเรกทอรีจำนวนมากและใช้พารามิเตอร์สุดท้ายเป็นเส้นทางปลายทาง โปรดทราบว่าหากคุณใช้เส้นทางลึกที่สัมพันธ์กันเป็นแหล่งที่มาคุณสามารถtarสร้างไดเรกทอรีไดเรกทอรีที่ขึ้นต้นเดียวกันได้โดยอัตโนมัติ

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

cpไม่ได้อยู่ในรุ่นมาตรฐาน

คุณสามารถกำหนดพื้นหลัง cp และแสดงขนาดขณะรอcpให้เสร็จ

ฉันใช้perl นี้เพื่อตรวจสอบการเติบโตของไฟล์เดียว แต่มันทำงานจากภายนอกไปยัง cp (หรือสิ่งอื่นที่ฉันทำ)



5

แม้ว่าจะทำให้คุณสถิติความคืบหน้าบางอย่างถ้าคุณต้องการแถบความคืบหน้าคุณควรใช้rsyncpv

คุณสามารถใช้cpvwrapper สำหรับpvด้วยไวยากรณ์ที่ง่ายกว่าคล้ายกับcpที่คุณสามารถใช้เพื่อคัดลอกไดเรกทอรีซ้ำ

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถรับได้ที่นี่


+1 pvสำหรับคำใบ้ใน ยินดีที่ได้พบ!
ปีเตอร์

4

การใช้เครื่องมือเช่นmc(ผู้บัญชาการเที่ยงคืน) อาจเป็นทางเลือกที่ดีสำหรับคำตอบอื่น ๆ

มันเป็นตัวจัดการไฟล์อย่างง่ายที่แสดงให้คุณเห็นความคืบหน้าการคัดลอก / ย้าย


4

dd status=progress

เพิ่มตัวเลือกใน GNU Coreutils 8.24+ (Ubuntu 16.04):

dd if=src of=dst status=progress

Stdout เป็นบรรทัดที่อัปเดตเป็นระยะดังนี้:

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

ดูเพิ่มเติม: คุณติดตามความคืบหน้าของววได้อย่างไร? | ถาม Ubuntu


4

อีกวิธีง่ายๆคือดูโฟลเดอร์เอาท์พุทดังนี้:

ลินุกซ์ / Cygwin: watch -n 10 --differences du -sk --apparent-size <WATCHED_FOLDER>

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

ยูทิลิตี้ที่มีประโยชน์นี้จะทำงานduและเน้นความแตกต่าง

อีกวิธีหนึ่งที่อาจเป็นไปได้คือการเขียนสคริปต์แบบง่าย ๆ ที่วนรอบการเรียกduและการแยกการประมาณปริมาณงานโดยประมาณ


3

เครื่องมือนี้เป็นคำสั่งยูทิลิตี้สำหรับ Linux ที่มองหาคำสั่งพื้นฐานของ coreutils (cp, mv, dd, tar, gzip / gunzip, cat, ฯลฯ ) ที่ทำงานอยู่ในระบบของคุณในปัจจุบันและแสดงเปอร์เซ็นต์ของข้อมูลที่คัดลอก:

https://github.com/Xfennec/cv


1
สิ่งนี้ได้รับการแนะนำโดย @AmrMostafa ในเดือนพฤศจิกายน '14
Dubu

2

ฉันเพิ่งมีกรณีที่ cp ถูกบล็อกมากหรือน้อยเนื่องจากข้อผิดพลาด FUSE ในระบบไฟล์ที่ได้รับ

หากคุณไม่สามารถเปลี่ยนจาก cp (เช่นเพราะ --sparse = เสมอ) และต้องการบางสิ่งที่เชื่อถือได้จริงสำหรับความคืบหน้าไปผ่าน / 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 - คัดลอกไฟล์ในอินเตอร์เฟส curses (แสดงแถบความคืบหน้าใน Linux)

DESCRIPTION: vcp ทำการคัดลอกไฟล์และไดเร็กตอรี่ในอินเตอร์เฟสของ curses, โดยมีข้อความเฉพาะเอาต์พุตเท่านั้น ตัวเลือกและเอาต์พุตของมันคล้ายกับ cp ของ BSD ในขณะที่เพิ่มคุณสมบัติใหม่บางอย่าง

ให้ข้อมูลเกี่ยวกับ:

  • คัดลอกไฟล์และซ้ายเพื่อคัดลอก
  • ข้อมูลที่เขียนและขนาดข้อมูลทั้งหมด
  • ข้อมูลถูกเขียนทุกวินาที
  • แถบสถานะสองแถบหนึ่งแถบแสดงสถานะไฟล์ปัจจุบันสถานะรวมอื่น ๆ (ยกเว้นไฟล์ 1 ไฟล์ทั้งแถบแสดงสถานะปัจจุบัน) และเปอร์เซ็นต์

เมื่อส่งออกไปยังคอนโซล:

  • แถบสถานะ
  • คัดลอกขนาดและความเร็ว

หน้าคน VCP: https://linux.die.net/man/1/vcp

ดาวน์โหลด vcp-2.2.tar.gz จาก:

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

การพึ่งพา: curses.h (libncurses-dev)

บน Ubuntu ให้ติดตั้ง:

sudo apt-get install libncurses-dev

หรือ

sudo apt-get install libncurses5-dev

ติดตั้ง vcp:

make && make install

คู่มือ:

man vcp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.