Czy przy przenoszeniu dużych katalogów mv
można sprawdzić postęp (%)? cp
Komenda na Gentoo miał -g
przełącznik, który pokazał postępy.
Czy przy przenoszeniu dużych katalogów mv
można sprawdzić postęp (%)? cp
Komenda na Gentoo miał -g
przełącznik, który pokazał postępy.
Odpowiedzi:
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/backup
i używaj mv normalnie.
Możesz to zrobić alias mvg="/usr/local/mvg -g"
, wystarczy powiedzieć mvg bigfile /mnt/backup
i bezpośrednio uzyskać pasek postępu.
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 -P
przełą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
bar
jest 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.
bar
mv
jeszcze się nie zawija .
rsync
nie zastępuje mv
całkowicie (pyta o to OP), szczególnie jeśli chodzi o szybkie kopiowanie w systemach plików typu kopiuj przy zapisie btrfs
.
Istnieje nowe narzędzie o nazwie, progress
któ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
progress
po instalacji, co pokazało mi postęp w mv
poleceniu, na które aktualnie czekałem. Dzięki!
sudo
(chyba tego samego użytkownika) - możesz również użyć, watch
aby powiedzieć, co się dzieje co 2 sekundy:watch progress -w
watch progress -w
ciebie możesz też po prostu użyćprogress -m
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 gzip
a 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 pv
jest 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, .bashrc
jeś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.
tar cf - source-dir | pv | tar xf - -C out-dir
da ci przepustowość całego katalogu. Jeśli znasz rozmiar i przejdziesz -s
do pv, może również dać ci postęp.
Jeśli Twoim celem jest przeniesienie / skopiowanie katalogu z paskiem postępu, ale unikanie nieterminowego GUI, dobrym wyborem jest mc (Midnight Commander).
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 -r
Na koniec jest potrzebny, ponieważ --remove-source-files
usuwa 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 -P
opcja 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=progress2
która pokazuje postęp dla całej operacji.
Aby uniknąć łatania coreutil, aby dodać pasek postępu do mv
i cp
, gcp
(Cooffier Goffiego) jest nową alternatywą: http://wiki.goffi.org/wiki/Gcp/en
Używać w taki sam sposób, jak w cp
przypadku opcji -r
rekurencyjności i -v
gadatliwoś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/
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 -sm
na plikach i df -m | grep copy_to_partition
. Następnie, jeśli jestem ciekawy, ile czasu zajmie, zrobię to df
ponownie i zobaczę, ile plików zostało skopiowanych.
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
w ładnym czytelnym formacie jest:
curl -o DESTINATION FILE://source
Być może trzeba go najpierw zainstalować sudo apt-get install curl
gcp
nie obsługuje przenoszenia pliku, tzn. pliki źródłowe muszą zostać usunięte ręcznie po udanym skopiowaniu.
Nie daje to paska postępu, ale trafia, CTRL-T
a wyślesz SIGINFO
do 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%
INFO: unknown signal; killall -l lists signals.
wrażenie, że SIGINFO działa tylko na niektórych BSD, a nie na standardowym POSIX.
Służy mv -v
do drukowania jednej linii na przeniesiony plik i pv -l
drukowania 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 mv
na tej samej partycji powinna być szybka. mv
do innej partycji będzie taki sam, jak cp source target
po 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
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.