É possível usar o wget para copiar arquivos no meu próprio sistema?

2

Eu quero mover / copiar arquivos grandes de tamanho em meu próprio sistema e quero usar o comando wget com sua opção -c para ter uma transferência recuperável. Os comandos copy ( cp ) ou move ( mv ) não fornecem essa opção para mim.

É possível usar wget para copiar esses arquivos de um diretório para outro diretório no meu próprio sistema?

    
por αғsнιη 30.09.2014 / 19:19

8 respostas

12

Sim, mas você precisa de um servidor da web configurado para atender aos arquivos que precisa copiar.

tente algo assim. Em um terminal, inicie um servidor da Web simples:

cd /etc/
python -m SimpleHTTPServer

abra outro terminal e faça:

wget http://localhost:8000/passwd 

o arquivo passwd será baixado para o seu diretório atual. Você está, na verdade, copiando-o de / etc / para o seu diretório pessoal.

Não sei por que você quer fazer isso, mas sim, a princípio, como você pode ver, é possível.

    
por roadmr 30.09.2014 / 19:26
17

Provavelmente faria mais sentido usar rsync . Por exemplo:

rsync -aP /source ~/destination

O sinalizador -P ou --partial impede que arquivos incompletos sejam excluídos se houver uma interrupção. Se você executar o mesmo comando novamente, qualquer transferência incompleta será retomada.

Desta forma, não há necessidade de se preocupar com um servidor web local, do qual você precisaria para wget .

    
por Brian Z 01.10.2014 / 08:22
9

Embora eu recomende strongmente rsync , você pode usar curl sem executar um servidor HTTP:

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

curl é diferente de wget , mas é, se não mais, poderoso. É sempre útil ter em qualquer sistema.

Em 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.
    
por muru 04.11.2014 / 08:05
2

lftp pode manipular sistemas de arquivos locais sem necessidade de um servidor.

  

lftp - Sofisticado programa de transferência de arquivos

     

lftp pode lidar com vários métodos de acesso a arquivos - ftp, ftps, http, https, hftp, fish, sftp e file (https e ftps só estão disponíveis quando o lftp é compilado com biblioteca GNU TLS ou OpenSSL ).

     

Além de protocolos semelhantes a FTP, o lftp suporta o protocolo BitTorrent como comando 'torrent'. A propagação também é suportada.

Referência: man lftp

  • Para copiar um arquivo exclusivo: (use mget para vários arquivos ou com * joker)

    lftp -c "get -c file:///<absolute-path-to-file>"
    
  • Para copiar uma pasta:

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

Primeiro -c para comando , segundo -c para continuar sempre que possível.

Por espaço, funciona para mim \ like shell ou %20 como URL da web.

    
por user.dz 08.01.2015 / 12:41
1

é possível. Você precisa ter um servidor web como o apache ou o nginx. se é apache, para copiar o arquivo você pode fazer isso

wget http://localhost/path/to/file/starting/from/var/www/ porque o diretório de home para o servidor apache é / var / www

    
por hermest 30.09.2014 / 19:35
1

Outra maneira de usar, usando dd :

  1. Verifique o tamanho do arquivo de destino usando stat ou ls -l command
  2. Copiar usando:

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

Exemplo:

$ 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

Pode ser prejudicial, já que pode sobrescrever o arquivo sem verificação. Aqui, uma função melhor para verificar o hash antes de continuar:

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 "" ]
    then
        ofpath="/'basename \"\"'"
    else
        ofpath=""
    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="" iflag=count_bytes count=$ofsize 2>/dev/null | md5sum | awk '{print }''
            #ifhash='head -c $ofsize "" | md5sum | awk '{print }''
            ofhash='md5sum "$ofpath" | awk '{print }''

            # 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  to $ofpath"
        dd if="" iflag=skip_bytes skip=$ofsize oflag=seek_bytes seek=$ofsize of="$ofpath"
        ;;
    [nN])
        echo -e "Start over...\ncopy  to $ofpath"
        dd if="" of="$ofpath"
        ;;
    *)
        echo "Cancelled!"
        ;;
    esac

}

Uso:

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

Exemplo:

$ 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
    
por user.dz 08.01.2015 / 16:56
1

Ainda de outra forma:

  1. Obtenha o tamanho restante para copiar

    echo 'stat -c "%s" <source-file>'-'stat -c "%s" <destination-file>' | bc
    
  2. Saída de redirecionamento de tail

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

Exemplo:

$ 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
    
por user.dz 08.01.2015 / 17:34
1

Como o tempo parece ser um problema para você - outra abordagem é usar o comando split para dividir um arquivo grande em partes menores, por exemplo, %código% para criar 1 GByte com o nome PIECESaa PIECESab ... PIECESzz

Uma vez que estes são criados, você usaria algo como split -b 1024m BIGFILE PIECES para reconstruir o BIGFILE, ou novamente, por causa de suas preocupações com o tempo:

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

Se a 'cópia' falhar, você pode mover os arquivos de ./done de volta para. e tente novamente quando o problema de tempo for resolvido. - Veja isto como uma alternativa quando o wget não é possível. É algo que usei ao longo dos anos quando copiei para um local remoto e algo como 'ftp simples' é o único meio de transporte possível - para as peças.

    
por Michael Felt 11.01.2015 / 15:28