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.

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.


+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! =)


@ 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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.