ฉันจะย้ายไฟล์และดูความคืบหน้าได้อย่างไร (เช่นด้วยแถบความคืบหน้า)


118

เมื่อย้ายไดเรกทอรีขนาดใหญ่ที่ใช้mvมีวิธีดูความคืบหน้า (%) หรือไม่ cpคำสั่งบน Gentoo มี-gสวิทช์ที่แสดงให้เห็นความคืบหน้า


3
การวัดทรูพุตของท่อในเปลือกอาจช่วยได้ แต่ฉันไม่รู้ว่ามันเป็นไปได้ที่จะใช้เครื่องมือเหล่านี้เมื่อทำการย้ายไฟล์หรือไม่
Michael Mrozek

คำตอบ:


50

คุณสามารถสร้างแพทช์ cp และ mv ซึ่งทั้งคู่รองรับสวิตช์ -g เพื่อแสดงความคืบหน้า มีคำแนะนำและแพทช์ในหน้านี้ อย่างไรก็ตาม : หน้าแนะนำให้คุณทำ

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

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

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

ซึ่งคัดลอกไฟล์ไปยัง / usr / local / bin ซึ่งมีไว้สำหรับโปรแกรมที่ผู้ใช้รวบรวมและให้ชื่ออื่น ดังนั้นเมื่อคุณต้องการแถบความคืบหน้าคุณพูดmvg -g bigfile /mnt/backupและใช้ mv ตามปกติ

นอกจากนี้คุณสามารถทำalias mvg="/usr/local/mvg -g"แล้วคุณจะต้องพูดmvg bigfile /mnt/backupและรับแถบความคืบหน้าโดยตรง


2
น่าเสียดายที่ไม่มีการแก้ไขใน“ หน้านี้” อีกต่อไปและดูเหมือนว่าจะไม่ได้รับการจัดทำดัชนีใน Web Archive ดูเหมือนจะมีแพตช์จำนวนมากที่มีชื่อและฟังก์ชั่นที่คล้ายกันคุณสามารถแก้ไขคำตอบของคุณเพื่อให้ชัดเจนว่าคุณหมายถึงอะไร
Gilles

ฉันคิดว่าgithub.com/atdt/advcpmvเป็นตัวตายตัวแทนที่ถูกต้องและมีแพตช์เดียวกันดังนั้นฉันจึงเปลี่ยนลิงค์ให้ชี้ไปที่มัน
fschmitt

93

ฉันไม่ชอบความคิดที่จะเขียนทับไบนารีจาก coreutil เมื่อมีวิธีแก้ปัญหาที่ง่ายกว่าดังนั้นนี่คือของฉัน:

rsync : Rsync คัดลอกไฟล์และมี-Pสวิตช์สำหรับแถบความคืบหน้า ดังนั้นหากคุณติดตั้ง rsync คุณสามารถใช้นามแฝงง่ายๆใน shells dotfile ของคุณ:

alias cp='rsync -aP'

ข้อเสียคือ rsync นั้นช้ากว่าซีพีเล็กน้อย แต่คุณควรวัดสิ่งนี้ด้วยเวลาและตัดสินใจด้วยตัวเองฉันสามารถอยู่กับมันได้ :-)

เชลล์สคริปต์ : เชลล์สคริปต์สามารถสร้างแถบความคืบหน้าได้ ฉันพบสิ่งนี้เมื่อไม่นานมานี้บนเน็ตและฉันจำที่มาไม่ได้:

#!/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
}

จะมีลักษณะดังนี้:

% cp_p /home/echox/foo.dat /home/echox/bar.dat
66% [===============================>                      ]

บาร์ :

'bar' - 'cat' พร้อมแถบความคืบหน้าของ ASCII

barเป็นเชลล์สคริปต์ขนาดเล็กเพื่อแสดงแถบกระบวนการสำหรับการดำเนินการทุกประเภท (cp, tar และอื่น ๆ ) คุณสามารถหาตัวอย่างได้จากหน้าแรกของโครงการ

มันเขียนไว้สำหรับเปลือก bourne ดังนั้นมันจะวิ่งไปทุกหนทุกแห่ง


3
barไม่ได้ตัดmvเลย
Tobu

5
เครดิตสำหรับเชลล์สคริปต์
Lamnk

1
โปรดทราบว่าrsyncไม่ได้แทนmv(OP จะขอเกี่ยว) btrfsอย่างสมบูรณ์โดยเฉพาะอย่างยิ่งเมื่อมันมาถึงสำเนาอย่างรวดเร็วบนระบบไฟล์สำเนาเมื่อเขียนเช่น
Karl Richter

74

มีเครื่องมือใหม่ที่เรียกprogressว่า descriptor ใด ๆ ที่เกี่ยวข้องกับคำสั่งที่รันอยู่และแสดงความคืบหน้าและความเร็ว: มีให้ที่นี่

progress -w

แสดงผลสถิติสำหรับการดำเนินการ cp, mv ฯลฯ ทั้งหมด


3
ว้าวฉันไม่ได้คาดหวังว่ามันจะยอดเยี่ยมขนาดนี้! ฉันเพิ่งพิมพ์progressหลังจากติดตั้งและมันทำให้ฉันมีความคืบหน้าสำหรับmvคำสั่งที่ฉันกำลังรอ ขอบคุณ!
jredd

3
ขอบคุณ! เมื่อย้ายสิ่งต่าง ๆ ในฐานะรูทดูเหมือนว่าคุณต้องใช้sudo(ผู้ใช้คนเดียวกันฉันเดา) - คุณสามารถใช้watchเพื่อบอกว่าเกิดอะไรขึ้นทุก 2 วินาที:watch progress -w
วิลฟ์

6
โปรแกรมที่ยอดเยี่ยม แต่เมื่อย้ายเช่นโฟลเดอร์ที่มีไฟล์จำนวนมากมันจะแสดงเฉพาะความคืบหน้าของไฟล์ปัจจุบันไม่ใช่ทั้งหมดของโฟลเดอร์ทั้งหมด แทนที่จะwatch progress -wใช้ก็สามารถใช้progress -m
mxmlnkn

6
IMHO นี่เป็นวิธีที่ใช้ระบบปฏิบัติการยูนิกซ์มากที่สุดในการแก้ปัญหา แทนที่จะทำการแก่น coreutils หรือใช้เครื่องมือที่ไม่ได้กำหนดไว้สำหรับวัตถุประสงค์เฉพาะ (เช่น rsync สำหรับ mv) หรือการเขียนสคริปต์ overkilling เพียงแค่ใช้เครื่องมือที่เขียนขึ้นเพื่อวัตถุประสงค์ในเรื่องด้วยความรัก
ความเศร้าโศก

34

คุณสามารถใช้คำสั่งไปป์pvเพื่อแสดงแถบความคืบหน้า:

pv /original/file > /new/file

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

rsync -aPตัวเลือกที่ดีมากคือการใช้ หากคุณต้องการแทนผนวกธงmv --remove-source-filesเพิ่มลงในของคุณ.bashrcหากคุณต้องการใช้คำสั่งบ่อยๆ:

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

ข้อเสียของที่นี่คือ rsync จะแสดงความคืบหน้าเท่านั้นไม่ใช่แถบความคืบหน้า


tar cf - source-dir | pv | tar xf - -C out-dirจะให้ปริมาณงานของไดเรกทอรีทั้งหมด ถ้าคุณรู้ขนาดและผ่าน-sไปยัง pv มันก็สามารถทำให้คุณก้าวหน้าได้เช่นกัน
arantius

6

หากเป้าหมายของคุณคือการย้าย / คัดลอกไดเรกทอรีด้วยแถบความคืบหน้า แต่หลีกเลี่ยง GUI ที่ไม่ใช่เทอร์มินัล mc (Midnight Commander) เป็นตัวเลือกที่ดี


3

rsyncทางออกของฉันคือการใช้ มันสามารถคัดลอกไดเรกทอรีลบไฟล์ต้นฉบับหลังจากคัดลอกสำเร็จ (เช่น "ย้าย" พวกเขา) และแสดงรายงานความคืบหน้าท่ามกลางคุณสมบัติอื่น ๆ (ซิงค์ซิงค์ไดเรกทอรีคัดลอกบางส่วนและทำงานผ่านเครือข่าย)

นี่คือวิธีที่ฉันจะย้ายไดเรกทอรีด้วย rsync พร้อมรายงานความคืบหน้า:

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

ตรวจสอบให้แน่ใจ$srcไม่ได้สิ้นสุดในเครื่องหมายมิฉะนั้นคุณจะได้รับหมายที่แตกต่างกว่าที่ของ cpGNU

rm -rที่สิ้นสุดเป็นสิ่งจำเป็นเพราะ--remove-source-filesจะลบเฉพาะไฟล์ที่มาหลังจากที่แต่ละคนจะถูกคัดลอกประสบความสำเร็จมากกว่าไม่ไดเรกทอรี &&ทำให้แน่ใจว่าจะเรียกมันเฉพาะถ้า rsync เสร็จสมบูรณ์เรียบร้อยแล้ว หากคุณหวาดระแวงคุณสามารถแทนที่ด้วยการเรียกซ้ำบางประเภทrmdirเช่นfind $src -d -exec rmdir {} +

ข้อผิดพลาดเพียงอย่างเดียวคือ-Pตัวเลือกจะแสดงความคืบหน้าสำหรับแต่ละไฟล์ไม่ใช่สำหรับการดำเนินการคัดลอกทั้งหมด สิ่งนี้อาจไร้ประโยชน์หากคุณพยายามย้ายไดเรกทอรีที่มีไฟล์ขนาดเล็กจำนวนมาก เวอร์ชันพัฒนาล่าสุดของ rsync มีแฟลกสำรอง--info=progress2ที่แสดงความคืบหน้าสำหรับการดำเนินการทั้งหมด


2

เพื่อหลีกเลี่ยงการ coreutil patching การเพิ่มแถบความคืบหน้าmvและcp, gcp(เครื่องถ่ายเอกสารของ Goffi) เป็นทางเลือกใหม่: http://wiki.goffi.org/wiki/Gcp/en

ใช้วิธีเดียวกันcpกับตัวเลือก-rสำหรับการเรียกซ้ำและการ-vใช้คำฟุ่มเฟือย

มันใช้คิวไฟล์เมื่อมีคำสั่งหลายคำสั่งพร้อมกัน นอกจากนี้ยังช่วยให้สามารถบันทึกชื่อไฟล์ที่คัดลอกในบันทึกได้ที่ส่วนการบันทึก man page sourceสำหรับรายละเอียด

นี่คือบทแนะนำที่ดีในการเริ่มต้นด้วยgcp: http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/


มี gmv เช่น gcp สำหรับ cp ไหม?
CodyChan

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

2

ก่อนอื่น: ฉันไม่เคยคัดลอกไฟล์ขนาดใหญ่โดยไม่ใช้ ionice ยกเว้นว่าฉันรู้ว่าฉันจะไม่ต้องการใช้คอมพิวเตอร์เป็นเวลาครึ่งชั่วโมงหรือมากกว่า

ประการที่สอง: พาร์ติชันของฉันทั้งหมดถูก jouranled ดังนั้นการคัดลอก intrapartition จึงใช้เวลาไม่นาน ถ้ามันเป็นสำเนานานฉันทำกับไฟล์และdu -sm df -m | grep copy_to_partitionจากนั้นหากอยากรู้ว่าต้องใช้เวลานานเท่าไรฉันจะทำdfอีกครั้งและดูว่ามีการคัดลอกไฟล์ไปเท่าใด


คุณสนใจที่จะแบ่งปันเคล็ดลับไอออนิซ คุณให้ความสำคัญกับ mv cpu-wise และ i / o disk ใด ๆ นี่คือการตั้งค่าของฉัน แต่การโหลดของ CPU ยังคงสูงแม้ว่าจะมีการคืนค่า: imgur.com/a/DLMJplz
ychaouche

2

ใน Mint ของฉันฉันชอบใช้ gcp กับสิ่งนี้หรือ curl-solution (ซึ่งดีมาก ๆ )

gcp SOURCE DESTINATION

คุณอาจต้องติดตั้ง sudo apt-get install gcp

และเป็นงานที่ดีมากและยอดเยี่ยมสำหรับแถบความคืบหน้าที่มีข้อมูลเกี่ยวกับ

  • % รวม
  • ได้รับ%
  • Xferd
  • ค่าเฉลี่ย DL
  • อัพโหลดความเร็ว
  • เหลือเวลาอีก
  • ใช้เวลา
  • เวลาทั้งหมด
  • ความเร็วปัจจุบัน

ในรูปแบบที่อ่านได้ดีคือ:

curl -o DESTINATION FILE://source

นอกจากนี้คุณอาจต้องติดตั้งก่อน sudo apt-get install curl


gcpไม่รองรับการย้ายไฟล์เช่นไฟล์ต้นฉบับจะต้องถูกลบออกด้วยตนเองหลังจากการคัดลอกสำเร็จ
Karl Richter

2

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

ตัวอย่างด่วน:

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
สิ่งนี้ไม่ได้ผลสำหรับฉัน: ฉันเข้าใจINFO: unknown signal; killall -l lists signals. แล้วว่า SIGINFO นั้นใช้กับ BSD บางตัวเท่านั้นไม่ใช่ใน POSIX มาตรฐาน
Brian Minton

2
ขวา. มันใช้งานได้ใน Mac OS X แต่ไม่น่าจะพูดได้ว่า Ubuntu
ชาร์ลส์

1

ใช้mv -vเพื่อพิมพ์หนึ่งบรรทัดต่อไฟล์ที่ถูกย้ายและpv -lเพื่อพิมพ์ความคืบหน้าตามจำนวนบรรทัด (ในจำนวนไฟล์ที่มีผล)

คุณจะต้องpv(ไปป์): http://www.ivarch.com/programs/pv.shtml

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

ใช้คำสั่งต่อไปนี้เพื่อรับจำนวนไฟล์:

find sourcedir | wc -l

คำสั่งนี้จะแสดงข้อมูลความคืบหน้าตามจำนวนไฟล์ที่คัดลอก วิธีนี้ใช้ได้ผลดีที่สุดหากมีไฟล์ขนาดเล็กจำนวนมาก หากมีเพียงไม่กี่ไฟล์ที่มีขนาดใหญ่มากคุณจะไม่สนุกมาก

โปรดทราบว่าmvในพาร์ทิชันเดียวกันควรจะรวดเร็ว mvพาร์ทิชันอื่นจะเป็นเช่นเดียวกับตามมาด้วยcp source target rm sourceดังนั้นนี่คือสองคำสั่งในการคัดลอกไดเรกทอรีด้วยข้อมูลความคืบหน้า

เพื่อรายงานความคืบหน้าตามจำนวนไฟล์ที่คัดลอก:

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

เพื่อรายงานความคืบหน้าตามจำนวนไบต์ที่คัดลอก:

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

ดูที่นี่สำหรับรายละเอียดเพิ่มเติม: ข้อมูลความคืบหน้าผ่าน pv สำหรับการคัดลอกไดเรกทอรี


1

ฉันสิ้นสุดการค้นหาคำตอบนี้หลังจากฉันเริ่มต้นคำสั่ง 'mv' ณ จุดที่ฉันไม่ต้องการเริ่มต้นอีกครั้ง หากคุณอยู่ในสถานการณ์นี้วิธีง่าย ๆ ในการติดตามความคืบหน้า (หรือเพื่อดูว่ามันไกลพอที่จะไม่ฆ่า):

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

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

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