Jak mogę przenosić pliki i wyświetlać postęp (np. Za pomocą paska postępu)?

118

Czy przy przenoszeniu dużych katalogów mvmożna sprawdzić postęp (%)? cpKomenda na Gentoo miał -gprzełącznik, który pokazał postępy.

letronje
źródło
3
Pomóc może pomiar przepustowości rur w powłoce , chociaż nie wiem, czy można łatwo korzystać z tych narzędzi podczas przenoszenia pliku
Michael Mrozek

Odpowiedzi:

50

Możesz zbudować załatane cp i mv, które następnie obsługują przełącznik -g, aby pokazać postęp. Na tej stronie znajdują się instrukcje i łatki . Jednak : strona nakazuje ci to zrobić

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

który zastępuje oryginalne cp i mv. Ma to dwie wady: Po pierwsze, jeśli zaktualizowany pakiet coreutils dotrze do twojego systemu, zostaną one zastąpione. Po drugie, jeśli problem z łataną wersją może spowodować uszkodzenie skryptów opartych na standardowych procesorach cp i mv. Wolałbym zrobić coś takiego:

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

który kopiuje pliki do / usr / local / bin, który jest przeznaczony dla programów skompilowanych przez użytkownika i nadaje im inną nazwę. Więc jeśli chcesz pasek postępu, mów mvg -g bigfile /mnt/backupi używaj mv normalnie.

Możesz to zrobić alias mvg="/usr/local/mvg -g", wystarczy powiedzieć mvg bigfile /mnt/backupi bezpośrednio uzyskać pasek postępu.

fschmitt
źródło
2
Niestety łatka na „tej stronie” nie jest już obecna i nie wydaje się, że została zindeksowana w archiwum internetowym. Wygląda na to, że jest wiele łatek o podobnej nazwie i funkcji. Czy mógłbyś edytować swoją odpowiedź, aby wyjaśnić, o którą chodziło?
Gilles,
Myślę, że github.com/atdt/advcpmv jest poprawnym następcą i ma tę samą łatkę, więc zmieniłem link, aby na nią wskazać.
fschmitt,
93

Nie podoba mi się pomysł, aby zastąpić pliki binarne z coreutil, gdy istnieją prostsze rozwiązania, więc oto moje:

rsync : Rsync kopiuje pliki i ma -Pprzełącznik paska postępu. Więc jeśli masz zainstalowany rsync, możesz użyć prostego aliasu w pliku dots powłoki:

alias cp='rsync -aP'

Minusem jest to, że rsync jest trochę wolniejszy niż cp, ale powinieneś zmierzyć to z czasem i zdecydować sam, mogę z tym żyć :-)

Skrypt powłoki : Skrypt powłoki może również utworzyć pasek postępu. Znalazłem to jakiś czas temu w sieci i nie pamiętam źródła:

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

Będzie to wyglądać następująco:

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

pasek :

„bar” - „cat” z paskiem postępu ASCII

barjest małym skryptem powłoki wyświetlającym pasek procesu dla wszelkiego rodzaju operacji (cp, tar itp.). Przykłady można znaleźć na stronie głównej projektu.

Jest również napisany dla skorupy Bourne'a, więc będzie działać wszędzie w pobliżu.

echox
źródło
3
barmvjeszcze się nie zawija .
Tobu,
5
Podziękowania
1
Zauważ, że rsyncnie zastępuje mvcałkowicie (pyta o to OP), szczególnie jeśli chodzi o szybkie kopiowanie w systemach plików typu kopiuj przy zapisie btrfs.
Karl Richter
74

Istnieje nowe narzędzie o nazwie, progressktóre może znaleźć dowolny deskryptor związany z uruchomionym poleceniem i pokazać postęp i prędkość: dostępne tutaj

progress -w

wyświetla statystyki wszystkich uruchomionych operacji cp, mv itp

naugtur
źródło
3
WOW, nie spodziewałem się, że to będzie takie niesamowite! Po prostu napisałem progresspo instalacji, co pokazało mi postęp w mvpoleceniu, na które aktualnie czekałem. Dzięki!
jredd
3
Dzięki! Kiedy przenosisz rzeczy jako root, wydaje się, że musisz użyć sudo(chyba tego samego użytkownika) - możesz również użyć, watchaby powiedzieć, co się dzieje co 2 sekundy:watch progress -w
Wilf
6
Świetny program, ale podczas przenoszenia np. Folderu z wieloma plikami pokazuje tylko postęp bieżącego pliku, a nie cały folder łącznie. Zamiast watch progress -wciebie możesz też po prostu użyćprogress -m
mxmlnkn
6
IMHO, jest to najbardziej uniksowy sposób rozwiązania problemu. Zamiast łatać coreutils lub używać narzędzi, które nie są przeznaczone do określonych celów (takich jak rsync dla mv) lub pisać skryptów z nadmierną liczbą zabójstw, po prostu używaj tego narzędzia z miłością do tego celu.
Smutek
34

Możesz użyć polecenia podglądu rur,pv aby wyświetlić pasek postępu:

pv /original/file > /new/file

Często używam tego skopiować duży plik na zamontowanym systemie plików sieci (w połączeniu z gzipa tar). Wadą jest to, że można skopiować tylko jeden plik, a nie katalog. I musisz nadać nowemu plikowi nazwę, nie możesz tak po prostu nadać katalogowi docelowemu cp. Jednak kopiowanie nie pvjest celem. Jest to potężne narzędzie i pozwala na znacznie więcej niż kopiowanie plików. Zobacz stronę główną, aby uzyskać więcej przykładów pv.

O wiele lepszą opcją jest użycie rsync -aP. Jeśli chcesz mv, dodaj flagę --remove-source-files. Dodaj to do swojego, .bashrcjeśli chcesz często używać poleceń:

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

Minusem tutaj jest to, że rsync pokazuje tylko postęp, a nie pasek postępu.

Lamnk
źródło
tar cf - source-dir | pv | tar xf - -C out-dirda ci przepustowość całego katalogu. Jeśli znasz rozmiar i przejdziesz -sdo pv, może również dać ci postęp.
arantius
6

Jeśli Twoim celem jest przeniesienie / skopiowanie katalogu z paskiem postępu, ale unikanie nieterminowego GUI, dobrym wyborem jest mc (Midnight Commander).

Christian Madsen
źródło
3

Moim rozwiązaniem jest użycie rsync. Może kopiować katalogi, usuwać pliki źródłowe po udanej kopii („przenosząc” je) i wyświetlać raporty postępu, a także wiele innych funkcji (w szczególności synchronizację częściowo skopiowanych katalogów i pracę w sieci).

Oto jak przenieść katalog za pomocą rsync z raportem postępu:

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

Upewnij się, $srcże nie kończy się odwrotnym ukośnikiem, w przeciwnym razie uzyskasz inne znaczenie niż GNU cp.

rm -rNa koniec jest potrzebny, ponieważ --remove-source-filesusuwa tylko pliki źródłowe, po każdym z nich jest z powodzeniem skopiowane, nie katalogi. &&Pilnuje, aby go uruchomić tylko wtedy, gdy rsync zakończy się pomyślnie. Jeśli jesteś paranoikiem, możesz go zastąpić pewnego rodzaju rekurencyjnym rmdir, takim jakfind $src -d -exec rmdir {} +

Jedynym błędem jest to, że -Popcja pokazuje postęp dla każdego pliku, a nie dla całej operacji kopiowania. Może to być bezużyteczne, jeśli próbujesz przenieść katalog z wieloma małymi plikami. Najnowsza wersja programistyczna rsync ma alternatywną flagę, --info=progress2która pokazuje postęp dla całej operacji.

Tobia
źródło
2

Aby uniknąć łatania coreutil, aby dodać pasek postępu do mvi cp, gcp(Cooffier Goffiego) jest nową alternatywą: http://wiki.goffi.org/wiki/Gcp/en

Używać w taki sam sposób, jak w cpprzypadku opcji -rrekurencyjności i -vgadatliwości.

Używa kolejki plików, gdy wiele poleceń jest wywoływanych jednocześnie. Pozwala także na zapisywanie skopiowanych nazw plików w dzienniku, zobacz sekcję Strona man oszczędzania źródła, aby uzyskać szczegółowe informacje.

Oto dobry poradnik na początek gcp: http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/

Yves Martin
źródło
Czy istnieje gmv jak gcp dla cp?
CodyChan,
Nie znalazłem żadnego odpowiednika. Nawiasem mówiąc, nie ma potrzeby używania paska postępu podczas uruchamiania „mv” na jednym systemie plików ... jest dość szybki. Jeśli przeniesienie zostanie wykonane w dwóch różnych systemach plików, zostanie ono zaimplementowane jako cp, a następnie usunie źródło, jeśli się powiedzie, lub usunie cel, jeśli się nie powiedzie. Prosty skrypt powłoki oparty na gcp może to zrobić poprawnie (z pierwszym sprawdzeniem, czy źródło i cel są naprawdę w różnych systemach plików)
Yves Martin
2

Po pierwsze: nigdy nie kopiuję dużych plików bez użycia ionice, chyba że wiem, że nie będę chciał korzystać z komputera przez pół godziny lub dłużej.

Po drugie: wszystkie moje partycje są uporządkowane, więc kopiowanie wewnątrz partycji nie zajmuje czasu. Jeśli jest to długa kopia, robię a du -smna plikach i df -m | grep copy_to_partition. Następnie, jeśli jestem ciekawy, ile czasu zajmie, zrobię to dfponownie i zobaczę, ile plików zostało skopiowanych.

HandyGandy
źródło
Czy chciałbyś podzielić się swoimi wskazówkami z jonice? jaki priorytet nadasz mv cpu-wise i dysk we / wy? Oto moje ustawienia, ale obciążenie procesora jest nadal wysokie nawet po ponownym uruchomieniu: imgur.com/a/DLMJplz
ychaouche
2

Na mojej Mennicy lubię używać gcp na tym lub lokówkach (co jest naprawdę fajne)

gcp SOURCE DESTINATION

Może być konieczne jego zainstalowanie sudo apt-get install gcp

I bardzo ładne i doskonałe zadanie dla paska postępu z informacjami o

  • % Ogółem
  • % Odebrane
  • % Xferd
  • Średnia DL
  • Speed ​​Upload
  • Pozostały czas
  • Czas spędzony
  • Łączny czas
  • Obecna prędkość

w ładnym czytelnym formacie jest:

curl -o DESTINATION FILE://source

Być może trzeba go najpierw zainstalować sudo apt-get install curl

The Pentadactyl
źródło
gcpnie obsługuje przenoszenia pliku, tzn. pliki źródłowe muszą zostać usunięte ręcznie po udanym skopiowaniu.
Karl Richter
2

Nie daje to paska postępu, ale trafia, CTRL-Ta wyślesz SIGINFOdo mv, który poinformuje, nad którym plikiem pracuje i jak daleko jest w tym procesie. Jest to bardzo przydatne w przypadku dużych transferów plików, być może nie jest tak przydatne w przypadku przesyłania wielu małych plików.

Szybki przykład:

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%
Charles
źródło
1
Nie działało to dla mnie: mam INFO: unknown signal; killall -l lists signals. wrażenie, że SIGINFO działa tylko na niektórych BSD, a nie na standardowym POSIX.
Brian Minton
2
Dobrze. Działa w systemie Mac OS X, ale prawdopodobnie nie w, powiedzmy, Ubuntu.
Charles,
1

Służy mv -vdo drukowania jednej linii na przeniesiony plik i pv -ldrukowania postępu na podstawie liczby linii (w efekcie liczby plików).

Będziesz potrzebować pv(przeglądarka potoków): http://www.ivarch.com/programs/pv.shtml

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

Użyj następującego polecenia, aby uzyskać liczbę plików:

find sourcedir | wc -l

To polecenie wyświetli informacje o postępach na podstawie liczby skopiowanych plików. Działa to najlepiej, jeśli istnieje wiele małych plików. Jeśli jest tylko kilka plików, które są ogromne, nie będziesz się dobrze bawić.

Pamiętaj, że mvna tej samej partycji powinna być szybka. mvdo innej partycji będzie taki sam, jak cp source targetpo rm source. Oto dwa polecenia do kopiowania katalogów z informacjami o postępie.

aby zgłosić postęp na podstawie liczby skopiowanych plików:

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

aby zgłosić postęp na podstawie skopiowanych bajtów:

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

Aby uzyskać więcej informacji, zobacz tutaj: informacje o postępach za pośrednictwem pv do kopiowania katalogu

lesmana
źródło
1

Niezmiennie kończę na szukaniu tej odpowiedzi po uruchomieniu polecenia „mv”, w którym to momencie nie chcę go ponownie uruchamiać. Jeśli znajdujesz się w tej sytuacji, bardzo prosty sposób na monitorowanie postępu (lub sprawdzenie, czy jest wystarczająco daleko, aby nie warto zabijać), to uruchomić:

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

Spowoduje to po prostu wydrukowanie rozmiaru katalogu, abyś mógł zobaczyć, ile danych zostało skopiowanych, lub możesz uruchomić go kilka razy, aby zobaczyć, jak szybko dane są przesyłane.

qazmonk
źródło