เมื่อย้ายไดเรกทอรีขนาดใหญ่ที่ใช้mv
มีวิธีดูความคืบหน้า (%) หรือไม่ cp
คำสั่งบน Gentoo มี-g
สวิทช์ที่แสดงให้เห็นความคืบหน้า
เมื่อย้ายไดเรกทอรีขนาดใหญ่ที่ใช้mv
มีวิธีดูความคืบหน้า (%) หรือไม่ cp
คำสั่งบน Gentoo มี-g
สวิทช์ที่แสดงให้เห็นความคืบหน้า
คำตอบ:
คุณสามารถสร้างแพทช์ 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
และรับแถบความคืบหน้าโดยตรง
ฉันไม่ชอบความคิดที่จะเขียนทับไบนารีจาก 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 ดังนั้นมันจะวิ่งไปทุกหนทุกแห่ง
bar
ไม่ได้ตัดmv
เลย
rsync
ไม่ได้แทนmv
(OP จะขอเกี่ยว) btrfs
อย่างสมบูรณ์โดยเฉพาะอย่างยิ่งเมื่อมันมาถึงสำเนาอย่างรวดเร็วบนระบบไฟล์สำเนาเมื่อเขียนเช่น
มีเครื่องมือใหม่ที่เรียกprogress
ว่า descriptor ใด ๆ ที่เกี่ยวข้องกับคำสั่งที่รันอยู่และแสดงความคืบหน้าและความเร็ว:
มีให้ที่นี่
progress -w
แสดงผลสถิติสำหรับการดำเนินการ cp, mv ฯลฯ ทั้งหมด
progress
หลังจากติดตั้งและมันทำให้ฉันมีความคืบหน้าสำหรับmv
คำสั่งที่ฉันกำลังรอ ขอบคุณ!
sudo
(ผู้ใช้คนเดียวกันฉันเดา) - คุณสามารถใช้watch
เพื่อบอกว่าเกิดอะไรขึ้นทุก 2 วินาที:watch progress -w
watch progress -w
ใช้ก็สามารถใช้progress -m
คุณสามารถใช้คำสั่งไปป์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 มันก็สามารถทำให้คุณก้าวหน้าได้เช่นกัน
หากเป้าหมายของคุณคือการย้าย / คัดลอกไดเรกทอรีด้วยแถบความคืบหน้า แต่หลีกเลี่ยง GUI ที่ไม่ใช่เทอร์มินัล mc (Midnight Commander) เป็นตัวเลือกที่ดี
rsync
ทางออกของฉันคือการใช้ มันสามารถคัดลอกไดเรกทอรีลบไฟล์ต้นฉบับหลังจากคัดลอกสำเร็จ (เช่น "ย้าย" พวกเขา) และแสดงรายงานความคืบหน้าท่ามกลางคุณสมบัติอื่น ๆ (ซิงค์ซิงค์ไดเรกทอรีคัดลอกบางส่วนและทำงานผ่านเครือข่าย)
นี่คือวิธีที่ฉันจะย้ายไดเรกทอรีด้วย rsync พร้อมรายงานความคืบหน้า:
rsync -aP --remove-source-files $src $dst && rm -r $src
ตรวจสอบให้แน่ใจ$src
ไม่ได้สิ้นสุดในเครื่องหมายมิฉะนั้นคุณจะได้รับหมายที่แตกต่างกว่าที่ของ cp
GNU
rm -r
ที่สิ้นสุดเป็นสิ่งจำเป็นเพราะ--remove-source-files
จะลบเฉพาะไฟล์ที่มาหลังจากที่แต่ละคนจะถูกคัดลอกประสบความสำเร็จมากกว่าไม่ไดเรกทอรี &&
ทำให้แน่ใจว่าจะเรียกมันเฉพาะถ้า rsync เสร็จสมบูรณ์เรียบร้อยแล้ว หากคุณหวาดระแวงคุณสามารถแทนที่ด้วยการเรียกซ้ำบางประเภทrmdir
เช่นfind $src -d -exec rmdir {} +
ข้อผิดพลาดเพียงอย่างเดียวคือ-P
ตัวเลือกจะแสดงความคืบหน้าสำหรับแต่ละไฟล์ไม่ใช่สำหรับการดำเนินการคัดลอกทั้งหมด สิ่งนี้อาจไร้ประโยชน์หากคุณพยายามย้ายไดเรกทอรีที่มีไฟล์ขนาดเล็กจำนวนมาก เวอร์ชันพัฒนาล่าสุดของ rsync มีแฟลกสำรอง--info=progress2
ที่แสดงความคืบหน้าสำหรับการดำเนินการทั้งหมด
เพื่อหลีกเลี่ยงการ 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/
ก่อนอื่น: ฉันไม่เคยคัดลอกไฟล์ขนาดใหญ่โดยไม่ใช้ ionice ยกเว้นว่าฉันรู้ว่าฉันจะไม่ต้องการใช้คอมพิวเตอร์เป็นเวลาครึ่งชั่วโมงหรือมากกว่า
ประการที่สอง: พาร์ติชันของฉันทั้งหมดถูก jouranled ดังนั้นการคัดลอก intrapartition จึงใช้เวลาไม่นาน ถ้ามันเป็นสำเนานานฉันทำกับไฟล์และdu -sm
df -m | grep copy_to_partition
จากนั้นหากอยากรู้ว่าต้องใช้เวลานานเท่าไรฉันจะทำdf
อีกครั้งและดูว่ามีการคัดลอกไฟล์ไปเท่าใด
ใน Mint ของฉันฉันชอบใช้ gcp กับสิ่งนี้หรือ curl-solution (ซึ่งดีมาก ๆ )
gcp SOURCE DESTINATION
คุณอาจต้องติดตั้ง sudo apt-get install gcp
และเป็นงานที่ดีมากและยอดเยี่ยมสำหรับแถบความคืบหน้าที่มีข้อมูลเกี่ยวกับ
ในรูปแบบที่อ่านได้ดีคือ:
curl -o DESTINATION FILE://source
นอกจากนี้คุณอาจต้องติดตั้งก่อน sudo apt-get install curl
gcp
ไม่รองรับการย้ายไฟล์เช่นไฟล์ต้นฉบับจะต้องถูกลบออกด้วยตนเองหลังจากการคัดลอกสำเร็จ
สิ่งนี้ไม่ได้ให้แถบความคืบหน้าแก่คุณ แต่กด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%
INFO: unknown signal; killall -l lists signals.
แล้วว่า SIGINFO นั้นใช้กับ BSD บางตัวเท่านั้นไม่ใช่ใน POSIX มาตรฐาน
ใช้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 สำหรับการคัดลอกไดเรกทอรี
ฉันสิ้นสุดการค้นหาคำตอบนี้หลังจากฉันเริ่มต้นคำสั่ง 'mv' ณ จุดที่ฉันไม่ต้องการเริ่มต้นอีกครั้ง หากคุณอยู่ในสถานการณ์นี้วิธีง่าย ๆ ในการติดตามความคืบหน้า (หรือเพื่อดูว่ามันไกลพอที่จะไม่ฆ่า):
du -hs /directory/you're/moving/data/to
นี่จะพิมพ์ขนาดของไดเรกทอรีเพื่อให้คุณสามารถดูจำนวนข้อมูลที่ถูกคัดลอกหรือคุณสามารถเรียกใช้สองสามครั้งเพื่อดูว่าการถ่ายโอนข้อมูลรวดเร็วแค่ไหน