मैं फ़ाइलों को कैसे स्थानांतरित कर सकता हूं और प्रगति देख सकता हूं (जैसे प्रगति पट्टी के साथ)?


118

बड़ी निर्देशिकाओं का उपयोग करते हुए mv, क्या प्रगति (%) को देखने का एक तरीका है? cpGentoo पर आदेश एक था -gस्विच प्रगति से पता चला कि।


3
शेल में पाइप पाइप थ्रूपुट मदद कर सकता है, हालांकि मुझे नहीं पता कि अगर फ़ाइल को स्थानांतरित करते समय आसानी से उन उपकरणों का उपयोग करना संभव है
माइकल Mrozek

जवाबों:


50

आप एक पैच cp और mv बना सकते हैं जो तब प्रगति दिखाने के लिए दोनों -g स्विच का समर्थन करते हैं। इस पृष्ठ पर निर्देश और पैच हैं । हालाँकि : पृष्ठ आपको करने का निर्देश देता है

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

जो मूल सीपी और एमवी को अधिलेखित करता है। इसके दो नुकसान हैं: सबसे पहले, यदि आपके सिस्टम में एक अद्यतन कोरूटिल्स पैकेज आता है, तो वे ओवरराइट किए जाते हैं। दूसरे, यदि पैच किए गए संस्करण में समस्या है, तो वे मानक cp और mv पर निर्भर स्क्रिप्ट को तोड़ सकते हैं। मैं ऐसा कुछ करना चाहूंगा:

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

जो फाइलों को / usr / लोकल / बिन में कॉपी करता है जो उपयोगकर्ता संकलित कार्यक्रमों के लिए अभिप्रेत है और उन्हें एक अलग नाम देता है। इसलिए जब आप एक प्रगति बार चाहते हैं, तो आप mvg -g bigfile /mnt/backupसामान्य रूप से एमवी का उपयोग करते हैं।

इसके अलावा आप कर सकते हैं alias mvg="/usr/local/mvg -g"तो आपको केवल कहने की जरूरत है mvg bigfile /mnt/backupऔर सीधे प्रगति पट्टी प्राप्त करें।


2
दुर्भाग्य से "इस पृष्ठ" पर पैच अब मौजूद नहीं है और यह वेब संग्रह में अनुक्रमित नहीं हुआ है। एक समान नाम और फ़ंक्शन के साथ कई पैच दिखाई देते हैं , क्या आप अपने उत्तर को स्पष्ट करने के लिए संपादित कर सकते हैं कि आपका कौन सा मतलब है?
गाइल्स

मुझे लगता है कि github.com/atdt/advcpmv एक वैध उत्तराधिकारी है और इसमें एक ही पैच है इसलिए मैंने इसे इंगित करने के लिए लिंक बदल दिया।
fschmitt

93

जब सरल उपाय होते हैं, तो मैं कोर्यूटिल से बायनेरिज़ को अधिलेखित करने का विचार पसंद नहीं करता, इसलिए यहां मेरा है:

rsync : रुपीस फ़ाइलों की प्रतिलिपि बनाता है और इसमें -Pप्रगति पट्टी के लिए एक स्विच होता है। इसलिए यदि आपने rsync स्थापित किया है, तो आप अपने गोले dotfile में एक साधारण उपनाम का उपयोग कर सकते हैं:

alias cp='rsync -aP'

नकारात्मक पक्ष यह है, कि rsync cp की तुलना में थोड़ा धीमा है, लेकिन आपको इसे समय के साथ मापना चाहिए और अपने स्वयं के लिए निर्णय लेना चाहिए, मैं इसके साथ रह सकता हूं :-)

शेल स्क्रिप्ट : शेल स्क्रिप्ट प्रगति पट्टी भी बना सकती है। मुझे यह कुछ समय पहले नेट पर मिला था और मुझे स्रोत याद नहीं है:

#!/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% [===============================>                      ]

बार :

ASCII प्रगति पट्टी के साथ 'बार' - 'कैट'

barसभी प्रकार के ऑपरेशन (cp, tar, आदि) के लिए एक प्रक्रिया पट्टी प्रदर्शित करने के लिए एक छोटी सी शेल स्क्रिप्ट है। आप प्रोजेक्ट होमपेज पर उदाहरण पा सकते हैं

इसका बोर्न शेल के लिए भी लिखा गया है, इसलिए यह हर जगह पास में चलेगा।


3
barmvअभी तक लपेट नहीं है।
तोबू


1
ध्यान दें कि पूरी तरह से (ओपी के बारे में पूछ रहा है) rsyncप्रतिस्थापित नहीं करता mvहै, खासकर जब यह कॉपी-ऑन-राइट फाइलसिस्टम जैसे फास्ट कॉपी पर आता है btrfs
कार्ल रिक्टर

74

यहां एक नया टूल है जिसे progressरनिंग कमांड से संबंधित कोई भी डिस्क्रिप्टर मिल सकता है और प्रगति और गति दिखा सकता है: यहां उपलब्ध है

progress -w

सभी चल रहे cp, mv इत्यादि कार्यों के लिए आँकड़े को आउटपुट करता है


3
वाह, मुझे उम्मीद नहीं थी कि यह इतना भयानक होगा! मैंने बस progressस्थापित करने के बाद टाइप किया और इसने मुझे उस mvकमांड के लिए प्रगति के साथ प्रस्तुत किया जिसका मैं वर्तमान में इंतजार कर रहा था। धन्यवाद!
jredd

3
धन्यवाद! जब सामान को एक जड़ के रूप में स्थानांतरित किया जाता है तो ऐसा लगता है कि आपको इसका उपयोग करना होगा sudo(वही उपयोगकर्ता जो मुझे लगता है) - आप यह watchकहने के लिए भी उपयोग कर सकते हैं कि हर 2 सेकंड में क्या हो रहा है:watch progress -w
विल्फ

6
बहुत बढ़िया कार्यक्रम, लेकिन कई फाइलों के साथ एक फ़ोल्डर जैसे चलते समय यह केवल वर्तमान फ़ाइल की प्रगति दिखाता है, कुल फ़ोल्डर नहीं। इसके बजाय watch progress -wआप भी बस का उपयोग कर सकते हैंprogress -m
mxmlnkn

6
IMHO, यह समस्या को हल करने का सबसे यूनिक्स-तरीका है। कोर्यूटिल्स को पैच करने या ऐसे टूल का उपयोग करने के लिए जो विशिष्ट उद्देश्यों (जैसे mv के लिए rsync) के लिए निर्दिष्ट नहीं हैं या ओवरकिलिंग स्क्रिप्ट लिखने के लिए, बस उस टूल का उपयोग प्रेम से विषय उद्देश्य के लिए लिखा गया है।
दु: ख

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इसे पास करना चाहते हैं तो यह आपको प्रगति भी दे सकता है।
arantius

6

यदि आपका लक्ष्य किसी निर्देशिका को प्रगति पट्टी के साथ स्थानांतरित / कॉपी करना है, लेकिन गैर-टर्मिनल GUI, mc (मिडनाइट कमांडर) से बचना एक अच्छा विकल्प है।


3

मेरा समाधान उपयोग करना है rsync। यह निर्देशिकाओं की प्रतिलिपि बना सकता है, एक सफल प्रति के बाद स्रोत फ़ाइलों को हटा दें (इस प्रकार "उन्हें" हिलाना) और प्रगति रिपोर्ट प्रदर्शित करें, कई अन्य सुविधाओं के बीच (सबसे विशेष रूप से कॉपी की गई निर्देशिकाओं को सिंक्रनाइज़ करना और नेटवर्क पर काम करना।)

यहां बताया गया है कि मैं प्रगति रिपोर्ट के साथ rsync के साथ एक निर्देशिका कैसे स्थानांतरित करूंगा:

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

सुनिश्चित करें कि बैकस्लैश में समाप्त नहीं$src होता है , अन्यथा आपको जीएनयू की तुलना में एक अलग अर्थ मिलेगा ।cp

rm -rअंत में की जरूरत है क्योंकि है --remove-source-filesकेवल, स्रोत फ़ाइलों को हटा के बाद हर एक को सफलतापूर्वक निर्देशिका में कॉपी किया जाता है, नहीं। &&केवल इसे चलाने के लिए अगर rsync को सफलतापूर्वक पूरा यकीन है कि बनाता है। यदि आप पागल हैं, तो आप इसे किसी प्रकार के पुनरावर्ती के साथ बदल सकते हैं rmdir, जैसे किfind $src -d -exec rmdir {} +

एकमात्र गड़बड़ यह है कि -Pविकल्प प्रत्येक फ़ाइल के लिए प्रगति दिखाता है, संपूर्ण कॉपी ऑपरेशन के लिए नहीं। यदि आप एक निर्देशिका को कई छोटी फाइलों के साथ स्थानांतरित करने का प्रयास कर रहे हैं तो यह बेकार हो सकता है। Rsync के नवीनतम विकास संस्करण में एक वैकल्पिक ध्वज है --info=progress2जो पूरे ऑपरेशन के लिए प्रगति दिखाता है।


2

प्रगति बार जोड़ने के लिए पैच coreutil से बचने के लिए mvऔर cp, gcp(Goffi के कॉपियर) एक नया विकल्प है: http://wiki.goffi.org/wiki/Gcp/en

पुनरावृत्ति के लिए cpविकल्पों -rके साथ और -vक्रियाशीलता के लिए उसी तरह उपयोग करने के लिए।

जब कई कमांड समवर्ती रूप से लगाए जाते हैं तो यह एक फ़ाइल कतार का उपयोग करता है। यह लॉग में कॉपी किए गए फ़ाइल नामों को रिकॉर्ड करने की अनुमति देता है, विवरण के लिए स्रोत बचत मैन पेज अनुभाग देखें।

यहाँ शुरू करने के लिए एक अच्छा ट्यूटोरियल है gcp: http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/


Cp के लिए gmp जैसा gmv है?
कोडीन

मुझे कोई समकक्ष नहीं मिला है। वैसे, एक एकल फ़ाइल सिस्टम पर "एमवी" को चलाने पर प्रगति पट्टी की कोई आवश्यकता नहीं है ... यह काफी तेज है। यदि चाल दो अलग-अलग फ़ाइल सिस्टमों में की जाती है, तो इसे cp के रूप में लागू किया जाता है और यदि सफल होने पर स्रोत को हटा दिया जाता है, या विफल होने पर लक्ष्य को हटा दिया जाता है। Gcp पर आधारित एक सरल शेल स्क्रिप्ट इसे ठीक से कर सकती है (यह जानने के लिए कि क्या स्रोत और लक्ष्य अलग-अलग फ़ाइल सिस्टम पर हैं, यह जानने के लिए पहली जांच के साथ
Yves Martin

2

पहले बंद करें: मैं कभी भी आयनों का उपयोग किए बिना बड़ी फ़ाइलों की नकल नहीं करता, जब तक कि मुझे नहीं पता कि मैं आधे घंटे या उससे अधिक समय तक कंप्यूटर का उपयोग नहीं करना चाहूंगा।

दूसरा: मेरे सभी विभाजनों को प्रकाशित किया जाता है इसलिए अंतर्ज्ञान की नकल में समय नहीं लगता है। अगर यह एक लंबी प्रतिलिपि है मैं du -smफ़ाइलों पर और df -m | grep copy_to_partition। फिर अगर उत्सुक है कि मुझे कितना समय लगेगा तो मैं dfफिर से करूंगा और देखूंगा कि कितनी फाइलें कॉपी की गईं।


क्या आप अपने आयनस युक्तियों को साझा करना पसंद करेंगे? mv cpu- वार और डिस्क i / o वार को आप क्या प्राथमिकता देंगे? यहाँ मेरी सेटिंग्स हैं लेकिन सीपीयू लोड करने के बाद भी अधिक है: imgur.com/a/DLMJplz
ychaouche

2

अपने टकसाल पर मैं इस पर gcp या कर्ल-सॉल्यूशन का उपयोग करना पसंद करता हूं (जो वास्तव में अच्छा है)

gcp SOURCE DESTINATION

आपको इसे स्थापित करने की आवश्यकता हो सकती है sudo apt-get install gcp

और प्रगति के बारे में जानकारी के साथ एक बहुत अच्छा और उत्कृष्ट कार्य

  • % संपूर्ण
  • % प्राप्त किया
  • % Xferd
  • औसत डीएल
  • स्पीड अपलोड
  • शेष समय
  • समय बिताया
  • समय कुल
  • वर्तमान गति

एक अच्छा पठनीय प्रारूप है:

curl -o DESTINATION FILE://source

साथ ही, आपको इसे पहले इंस्टॉल करना पड़ सकता है sudo apt-get install curl


gcpफ़ाइल के हिलने का समर्थन नहीं करता है, अर्थात सफल नकल के बाद स्रोत फ़ाइलों को मैन्युअल रूप से हटाया जाना चाहिए।
कार्ल रिक्टर

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 केवल कुछ BSDs पर है, मानक POSIX में नहीं।
ब्रायन मिंटन

2
सही। यह मैक ओएस एक्स में काम करता है, लेकिन संभावना नहीं है, कहते हैं, उबंटू।
चार्ल्स

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

अधिक जानकारी के लिए यहां देखें: निर्देशिका कॉपी के लिए पीवी के माध्यम से प्रगति की जानकारी


1

वास्तव में मैं 'mv' कमांड शुरू करने के बाद इस उत्तर को खोजना चाहता हूं, जिस बिंदु पर मैं इसे फिर से शुरू नहीं करना चाहता। यदि आप इस स्थिति में प्रगति की निगरानी करने के लिए एक बहुत ही सरल तरीका है (या यह देखने के लिए कि क्या यह काफी दूर तक साथ है कि यह हत्या के लायक नहीं है):

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

यह सिर्फ डायरेक्टरी के आकार को प्रिंट करेगा ताकि आप देख सकें कि कितना डेटा कॉपी किया गया है, या आप इसे एक-दो बार चलाकर देख सकते हैं कि डेटा कितनी तेजी से ट्रांसफर हो रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.