web-dev-qa-db-ja.com

自分のシステムでwgetを使用してファイルをコピーすることはできますか?

自分のシステムで大きなサイズのファイルを移動/コピーし、wgetコマンドとその-cスイッチを使用して、再開可能な転送に切り替えたい。 copy(cp)またはmove(mv)コマンドは、このオプションを提供しません。

wgetを使用して、これらのファイルを自分のシステムのあるディレクトリから別のディレクトリにコピーすることはできますか?

4
αғsнιη

はい。ただし、コピーする必要があるファイルを提供するためにWebサーバーをセットアップする必要があります。

このようなものを試してください。ターミナルで、単純なWebサーバーを起動します。

cd /etc/
python -m SimpleHTTPServer

次に、別のターミナルを開いて次を実行します。

wget http://localhost:8000/passwd 

passwdファイルが現在のディレクトリにダウンロードされます。実際には、/ etc /からホームディレクトリにコピーしています。

なぜあなたがこれをしたいのか分かりませんが、はい、原則として、あなたが見ることができるように、それは可能です。

16
roadmr

代わりにrsyncを使用する方がおそらく意味があります。例えば:

rsync -aP /source ~/destination

-Pまたは--partialフラグは、中断がある場合に不完全なファイルが削除されるのを防ぎます。同じコマンドを再度実行すると、不完全な転送が再開されます。

この方法では、wgetに必要なローカルWebサーバーを気にする必要はありません。

17
Brian Z

rsyncを強くお勧めしますが、HTTPサーバーを実行せずにcurlを使用できます。

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

curlwgetとは異なりますが、それだけではありませんが強力です。任意のシステムで使用すると常に便利です。

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は、サーバーを必要とせずにローカルファイルシステムを処理できます。

lftp-高度なファイル転送プログラム

lftpはいくつかのファイルアクセス方法を処理できます-ftp、ftps、http、https、hftp、fish、sftpおよびfile(httpsおよびftpはlftpの場合のみ利用可能ですGNU TLSまたはOpenSSLライブラリを使用してコンパイルされます)。

FTPのようなプロトコルに加えて、lftpはBitTorrentプロトコルを「torrent」コマンドとしてサポートしています。シードもサポートされています。

参照:man lftp

  • Sinlgeファイルをコピーするには:(複数のファイルまたは* jokerでmgetを使用します)

    lftp -c "get -c file:///<absolute-path-to-file>"
    
  • フォルダーをコピーするには:

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

最初の-c forcommand、2番目の-c forcontinue可能な限り。

スペースについては、Shellのような\またはWeb URLのような%20のいずれかで機能します。

2
user.dz

それが可能だ。 ApacheやnginxなどのWebサーバーが必要です。 Apacheの場合、ファイルをコピーするにはこれを行うことができます

wget http://localhost/path/to/file/starting/from/var/www/は、Apacheサーバーのホームディレクトリが/ var/wwwであるため

1
hermest

さらに別の方法:

  1. コピーする残りのサイズを取得

    echo `stat -c "%s" <source-file>`-`stat -c "%s" <destination-file>` | bc
    
  2. tailの出力をリダイレクトします

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

例:

$ 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

時間が問題になると思われるため、別の方法として、splitコマンドを使用して大きなファイルを小さな断片に分割します。たとえば、split -b 1024m BIGFILE PIECESを使用して、PIECESaa PIECESab ... PIECESzz

これらが作成されたら、cat PIECES?? >/some/where/else/BIGFILEのようなものを使用してBIGFILEを再構築します。時間の問題があるため、次のようにします。

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

「コピー」が失敗した場合、ファイルを./doneからに戻すことができます。時間の問題が解決したらもう一度お試しください。 -wgetが不可能な場合の代替手段としてこれを参照してください。それは私が長年にわたって遠隔地にコピーするときに使用したものであり、「プレーンftp」のようなものが唯一の可能なトランスポートです-ピースのために。

1
Michael Felt

ddを使用した別の使用方法:

  1. statまたはls -lコマンドを使用して宛先ファイルのサイズを確認します
  2. 次を使用してコピー:

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

例:

$ 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

チェックせずにファイルを上書きする可能性があるため、有害である可能性があります。続行する前にハッシュをチェックするより良い機能があります:

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

}

つかいます:

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

例:

$ 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