自分のシステムで大きなサイズのファイルを移動/コピーし、wget
コマンドとその-c
スイッチを使用して、再開可能な転送に切り替えたい。 copy(cp
)またはmove(mv
)コマンドは、このオプションを提供しません。
wget
を使用して、これらのファイルを自分のシステムのあるディレクトリから別のディレクトリにコピーすることはできますか?
はい。ただし、コピーする必要があるファイルを提供するためにWebサーバーをセットアップする必要があります。
このようなものを試してください。ターミナルで、単純なWebサーバーを起動します。
cd /etc/
python -m SimpleHTTPServer
次に、別のターミナルを開いて次を実行します。
wget http://localhost:8000/passwd
passwdファイルが現在のディレクトリにダウンロードされます。実際には、/ etc /からホームディレクトリにコピーしています。
なぜあなたがこれをしたいのか分かりませんが、はい、原則として、あなたが見ることができるように、それは可能です。
代わりにrsync
を使用する方がおそらく意味があります。例えば:
rsync -aP /source ~/destination
-P
または--partial
フラグは、中断がある場合に不完全なファイルが削除されるのを防ぎます。同じコマンドを再度実行すると、不完全な転送が再開されます。
この方法では、wget
に必要なローカルWebサーバーを気にする必要はありません。
rsync
を強くお勧めしますが、HTTPサーバーを実行せずにcurl
を使用できます。
curl -O -C - file:///path/to/some/file
curl
はwget
とは異なりますが、それだけではありませんが強力です。任意のシステムで使用すると常に便利です。
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
は、サーバーを必要とせずにローカルファイルシステムを処理できます。
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
のいずれかで機能します。
それが可能だ。 ApacheやnginxなどのWebサーバーが必要です。 Apacheの場合、ファイルをコピーするにはこれを行うことができます
wget http://localhost/path/to/file/starting/from/var/www/
は、Apacheサーバーのホームディレクトリが/ var/wwwであるため
さらに別の方法:
コピーする残りのサイズを取得
echo `stat -c "%s" <source-file>`-`stat -c "%s" <destination-file>` | bc
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
時間が問題になると思われるため、別の方法として、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」のようなものが唯一の可能なトランスポートです-ピースのために。
dd
を使用した別の使用方法:
stat
またはls -l
コマンドを使用して宛先ファイルのサイズを確認します次を使用してコピー:
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