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?
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.
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
.
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.
lftp
peut gérer les systèmes de fichiers locaux sans avoir besoin d'un serveur.
lftp
- Programme sophistiqué de transfert de fichierslftp 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.
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
Encore une autre manière:
Obtenir la taille restante à copier
echo `stat -c "%s" <source-file>`-`stat -c "%s" <destination-file>` | bc
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
Puisque le temps vous semble être un problème, une autre approche consiste à utiliser la commande split
pour 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.
Une autre façon d'utiliser, en utilisant dd
:
stat
ou ls -l
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