web-dev-qa-db-fra.com

Est-il possible d'utiliser wget pour copier des fichiers sur mon propre système?

Je souhaite déplacer/copier des fichiers volumineux sur mon propre système et utiliser la commande wget avec son commutateur -c pour obtenir un transfert pouvant être repris. Les commandes copier (cp) ou déplacer (mv) ne me fournissent pas cette option.

Est-il possible d'utiliser wget pour copier ces fichiers d'un répertoire à un autre dans mon propre système?

3
αғsнιη

Oui, mais vous avez besoin d’un serveur Web configuré pour traiter les fichiers à copier.

essayez quelque chose comme ça. Sur un terminal, démarrez un serveur Web simple:

cd /etc/
python -m SimpleHTTPServer

puis ouvrez un autre terminal et faites:

wget http://localhost:8000/passwd 

le fichier passwd sera téléchargé dans votre répertoire actuel. Vous êtes en train de le copier depuis/etc/dans votre répertoire personnel.

Je ne sais pas trop pourquoi vous voulez faire cela, mais oui, en principe, comme vous pouvez le constater, c'est possible.

15
roadmr

Il serait probablement plus judicieux d'utiliser rsync à la place. Par exemple:

rsync -aP /source ~/destination

L'indicateur -P ou --partial empêche la suppression de fichiers incomplets en cas d'interruption. Si vous exécutez à nouveau la même commande, tout transfert incomplet sera repris.

De cette façon, inutile de vous embêter avec un serveur Web local, dont vous auriez besoin pour wget.

17
Brian Z

Bien que je recommande vivement rsync, vous pouvez utiliser curl sans utiliser de serveur HTTP:

curl -O -C - file:///path/to/some/file

curl est différent de wget, mais est tout aussi puissant, sinon plus. C'est toujours pratique d'avoir sur n'importe quel système.

De man curl :

   -C, --continue-at <offset>
          Continue/Resume  a  previous  file transfer at the given offset.
          Use  "-C  -" to tell curl to automatically find out where/how to
          resume the transfer
   -O, --remote-name
          Write  output to a local file named like the remote file we get.
9
muru

lftp peut gérer les systèmes de fichiers locaux sans avoir besoin d'un serveur.

lftp - Programme sophistiqué de transfert de fichiers

lftp peut gérer plusieurs méthodes d'accès aux fichiers - ftp, ftps, http, https, hftp, fish, sftp et file (https et ftps ne sont disponibles que lorsque lftp est compilé avec la bibliothèque GNU TLS ou OpenSSL).

Outre les protocoles de type FTP, lftp prend en charge le protocole BitTorrent en tant que commande `torrent '. Le semis est également pris en charge.

Référence: man lftp

  • Pour copier un fichier simple: (utilisez mget pour plusieurs fichiers ou avec * joker)

    lftp -c "get -c file:///<absolute-path-to-file>"
    
  • Pour copier un dossier:

    lftp -c "mirror -c file:///<absolute-path-to-directory>"
    

Premier -c pour commande , deuxième -c pour continue autant que possible.

Pour l’espace, cela fonctionne pour moi soit \ comme Shell ou %20 comme URL Web.

2
user.dz

c'est possible. Vous devez disposer d'un serveur Web tel qu'Apache ou nginx. si c'est Apache, pour copier un fichier, vous pouvez le faire

wget http://localhost/path/to/file/starting/from/var/www/ car le répertoire de base du serveur Apache est/var/www

1
hermest

Encore une autre manière:

  1. Obtenir la taille restante à copier

    echo `stat -c "%s" <source-file>`-`stat -c "%s" <destination-file>` | bc
    
  2. Rediriger la sortie de tail

    tail -c <remaining-size> <source-file> >> <destination-file>
    

Exemple:

$ echo `stat -c "%s" /boot/grml/u1404_64_d.iso`-`stat -c "%s" /home/user/u1404_64_d.iso` | bc
433049600

$ tail -c 433049600 /boot/grml/u1404_64_d.iso >> /home/user/u1404_64_d.iso

$ md5sum /boot/grml/u1404_64_d.iso /home/user/u1404_64_d.iso
dccff28314d9ae4ed262cfc6f35e5153  /boot/grml/u1404_64_d.iso
dccff28314d9ae4ed262cfc6f35e5153  /home/user/u1404_64_d.iso
1
user.dz

Puisque le temps vous semble être un problème, une autre approche consiste à utiliser la commande splitpour diviser un fichier volumineux en fichiers plus petits, par exemple, split -b 1024m BIGFILE PIECES pour créer des morceaux de 1 Go nommés PIECESaa PIECESab ... PIECESzz

Une fois que ceux-ci sont créés, vous utiliserez quelque chose comme cat PIECES?? >/some/where/else/BIGFILE pour reconstruire BIGFILE, ou encore, à cause de vos problèmes de temps:

mkdir done
>/somewhere/else/BIGFILE
for piece in PIECES??
do
    cat $piece >>/some/where/else/BIGFILE
    status=$?
    if [[ $status -eq 0 ]]
    then
        mv $piece done
    fi
done

Si la "copie" échoue, vous pouvez déplacer les fichiers de ./done vers. et réessayez une fois le problème de temps résolu. - Voir cela comme une alternative quand wget n'est pas possible. C’est quelque chose que j’ai utilisé au fil des années lors de la copie dans un lieu éloigné et quelque chose comme "un ftp simple" est le seul moyen de transport possible - pour les morceaux.

1
Michael Felt

Une autre façon d'utiliser, en utilisant dd:

  1. Vérifiez la taille du fichier de destination à l'aide de la commande stat ou ls -l
  2. Copier en utilisant:

    dd if=<source-file-path> iflag=skip_bytes skip=<dest-file-size> oflag=seek_bytes seek=<dest-file-size> of=<dest-file-path>
    

Exemple:

$ ls -l /home/user/u1404_64_d.iso
-rw-rw-r-- 1 user user 147186688 Jan  8 17:01 /home/user/u1404_64_d.iso

$ dd if=/boot/grml/u1404_64_d.iso \
  iflag=skip_bytes skip=147186688 oflag=seek_bytes seek=147186688 \
  of=/home/user/u1404_64_d.iso
1686798+0 records in
1686798+0 records out
863640576 bytes (864 MB) copied, 15.1992 s, 56.8 MB/s

$ md5sum /boot/grml/u1404_64_d.iso /home/user/u1404_64_d.iso
dccff28314d9ae4ed262cfc6f35e5153  /boot/grml/u1404_64_d.iso
dccff28314d9ae4ed262cfc6f35e5153  /home/user/u1404_64_d.iso

Cela pourrait être dangereux, car cela pourrait écraser le fichier sans vérification, voici une meilleure fonction pour vérifier le hachage avant de continuer:

ddc () {

    # enable hash check, need much time to read both files
    hashcheck=true

    # check destination folder existance or assume it's a file name
    if [ -d "$2" ]
    then
        ofpath="$2/`basename \"$1\"`"
    else
        ofpath="$2"
    fi

    # check destination file existance
    if [ ! -f "$ofpath" ]
    then
        a="n"
    else
        ofsize=`stat -c "%s" "$ofpath"`


        # calculate hash
        if [ $hashcheck ]
        then 
            ifhash=`dd if="$1" iflag=count_bytes count=$ofsize 2>/dev/null | md5sum | awk '{print $1}'`
            #ifhash=`head -c $ofsize "$1" | md5sum | awk '{print $1}'`
            ofhash=`md5sum "$ofpath" | awk '{print $1}'`

            # check hash before cont.
            if [ $ifhash == $ofhash ]
            then
                a="y"
            else
                echo -e "Files MD5 mismatch do you want to continue:\n(Y) Continue copy, (N) Start over, (Other) Cancel"
                read a
            fi
        else
            a="y"
        fi
    fi

    case $a in
    [yY])
        echo -e "Continue...\ncopy $1 to $ofpath"
        dd if="$1" iflag=skip_bytes skip=$ofsize oflag=seek_bytes seek=$ofsize of="$ofpath"
        ;;
    [nN])
        echo -e "Start over...\ncopy $1 to $ofpath"
        dd if="$1" of="$ofpath"
        ;;
    *)
        echo "Cancelled!"
        ;;
    esac

}

Utilisation:

ddc <source-file> <destination-file-or-folder>

Exemple:

$ ls -l /home/user/u1404_64_d.iso
-rw-rw-r-- 1 user user 241370112 Jan  8 17:09 /home/user/u1404_64_d.iso

$ ddc /boot/grml/u1404_64_d.iso /home/user/u1404_64_d2.iso
Continue...copy /boot/grml/u1404_64_d.iso to /home/user/u1404_64_d.iso
1502846+0 records in
1502846+0 records out
769457152 bytes (769 MB) copied, 13.0472 s, 59.0 MB/s
1
user.dz