Kopieren Sie die Datei in GNU / Linux mit Fortschrittsbalken und Ratenbegrenzung

7

Gibt es ein gutes Tool in GNU / Linux, das Dateien wie kopiert cp, aber auch Fortschritte anzeigt und die Geschwindigkeit begrenzt (und Änderungen ohne Unterbrechung begrenzt) pv?

Prototyp:

find source_directory | cpio -H newc -o | pv -s `du -bs source_directory/ | awk '{print $1}'` | (cd /destination/directory && cpio -di)

Auch rsync -aP source_directory /destionation/directory/, aber dies zeigt Fortschrittsbalken einzeln und nicht Rate ändern , nachdem gestartet.

Oder sollte ich vielleicht einfach einen Wrapper für pv / cpio schreiben? Erledigt.

Vi.
quelle

Antworten:

9

Schrieb das Skript, um find, cpio und pv zu verwenden, um die Aufgabe zu erfüllen. Die Rate kann begrenzt werden.

http://vi-server.org/vi/bin/cppv

Hier spiegeln:

#!/bin/bash 

set -e

if [ $# -lt 2 ]; then
    echo "cppv - copy files with progress bar and rate limiting ability"
    echo "Usage: cppv source_file[s] destination_file_or_directory"
    echo "No other non-positional command line arguments can be given"
    echo "Always recurses like find"
    echo "You can change copying speed limit on the fly with \"pv -R\" if you find out pv's PID"
    echo "Use FIND_OPTS, PV_OPTS, CPIO_O_OPTS, CPIO_I_OPTS to override arguments to the pipeline parts"
    echo "Examples:"
    echo "    cppv a b # Copy file a to b. Just calls \"pv a > b\""
    echo "    cppv a d/ # Copy file a to d/a. Calls \"find a | cpio -o | pv | (cd d && cpio -i)\""
    echo "    cppv *{01..26}*.mkv /mnt/usb/ # Copy all matching files to /mnt/usb/."
    echo "    cppv dir1 dir2 # duplicate dir1"
    echo "    PV_OPTS=\"-L 1M\" cppv . /tmp/ # Limit copying rate to 1M"
    echo "    cppv /home/vi/bin /tmp/ # Warning: Copy /home/vi/bin to /tmp/home/vi/bin"
    exit 1
fi;

true ${CPIO_O_OPTS:="-H newc -0o"}
true ${CPIO_I_OPTS:="-0diu --no-absolute-filenames"}
true ${FIND_OPTS:="-depth -print0"}

ARGS=( "$@" );

DEST="${ARGS[$#-1]}"
unset ARGS[$#-1];

if [[ ( "${1:0:1}" == "-"  && ! -e "$1" ) || ( "${DEST:0:1}" == "-" && ! -e "$DEST" )  ]]; then
    echo "There should not be any command line options. Only file names." >&2
    exit 1;
fi

DIRMODE=0

if [[ $# > 2 || "${DEST:${#DEST}-1:1}" == "/" || -d $DEST ]]; then
    DIRMODE=1
elif [[ -d "$1" && ! -d "$2" ]]; then
    DIRMODE=1
    mkdir "$DEST";
    DEST=`readlink -f "$DEST"`;
    cd "$1";
    ARGS=(".")
fi

if [ $DIRMODE == 0 ]; then
    pv "$1" > "$2" && exit 0;
fi;

if [ ! -d "$DEST" ]; then
    echo Not a directory: "$DEST" >&2
    exit 1
fi

if [ "${1:0:1}" == "/" ]; then
    echo "Warning: it will do a bit different thing than usual cp" >&2
    echo "    For example, copying $1 to $DEST$1, not to $DEST/`basename $1`" >&2
fi

SIZE=`du -sb "${ARGS[@]}" | perl -ne '/^(\d+)/ and $q+=$1; END{print $q}'`

find "${ARGS[@]}" $FIND_OPTS | cpio $CPIO_O_OPTS | pv -s $SIZE $PV_OPTS | (cd "$DEST" && cpio $CPIO_I_OPTS)

Jemand, bitte testen Sie es.

Vi.
quelle
+1 für dich! Ich fürchte, ich komme nicht dazu, es zu testen, aber es sieht ziemlich vielversprechend aus! Gute Arbeit!
Stapelüberlauf ist tot
Was ist pv? Ist das Pipe Viewer ? (Es ist standardmäßig nicht unter Ubuntu 10.04 installiert, daher habe ich es nicht).
Stefan Lasiewski
1
@Stefan Lasiewski Ja, das ist es. apt-get install pv
Vi.
1
Hinweis für Benutzer: Das Skript schlägt bei großen Dateien (> 2 GB) fehl.
Vi.
1

Ich schlage vor, Sie überprüfen dies: http://bash.cyberciti.biz/guide/A_progress_bar_%28gauge_box%29#File_Copy_Progress_Bar_With_Dialog

Es sieht ziemlich ordentlich aus! =)

Stapelüberlauf ist tot
quelle
@ dag729 Gern geschehen! ;)
Stapelüberlauf ist tot
"tt erhöht sich jedes Mal, wenn eine Datei nach $ DEST kopiert wird" - schlecht, ich möchte, dass es sowohl für viele kleine als auch für eine große Datei funktioniert. Und keine Ratenbegrenzung.
Vi.
1
@Vi - vielleicht könntest du es ein wenig anpassen? Dies ist nur ein Beispiel für die Anzeige eines Fortschrittsbalkens.
Stapelüberlauf ist tot
Nein, ich habe den Wrapper um "cpio | pv | cpio" geschrieben. Bald wird es hier veröffentlicht.
Vi.
1

Versuchen Sie es gcp. Sollte auf Ubuntu verfügbar sein.

Saurabh
quelle
Funktioniert (obwohl der Umgang mit speziellen Dateien fehlt)
Vi.
Gut installiert auf Ubuntu Oneric, gab mir aber Fehler und stürzte auf einem einfachengcp file destination
capdragon