• ベストアンサー

ftpASCIIモードをbinaryに変換にしたい

こんにちは 今本来バイナリーとしてダウンロードすべきファイル(hogehoge.tar.gz)を ASCIIモードでftpで取得してしまいました。 元ファイルを消してしまったので、今はそれをgz+tarで解凍しようとしても エラーが出てしまいます。 このファイルをASCII ->binaryファイルに戻す方法はないでしょうか? (多分改行コードや、文字コードを変換すればいいと思うのですが・・・) シェルスクリプトでも、プログラムでもLINUX、WINDOWS、MACで動くものなら もんだいありません。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4845/10256)
回答No.4

無理と言えば無理なのですが、場合によっては不可能というわけでも無い。文字コードまで変換したのなら実質的には無理ですが。 例えば、Unix上のftpサーバーからWindowsへダウンロードしたとすると、0x0A というバイトが、0x0D 0x0A と2バイトになります。なので、0x0D 0x0A という並びを探して 0x0A に直せば良い。 ただ、ftpソフトによって元データに 0x0D 0x0A という並びがあった時に 0x0D 0x0D 0x0A にしてくれるのか、0x0D 0x0A のままにするのか両方ありそう。もし後者なら大変。 逆のWindows→Unixは大変。0x0A というバイトがあった場合にそれは元々 0x0A であった場合もあれば、0x0D 0x0A という2バイトであった場合もある。ファイル中に 0x0A が100個あれば、元は何だったか、2の100乗パターンの可能性があるので、全パターンを試せばどれか当たりです。実質無理。 文字コード変換までしていた場合には、逆に変換すれば大部分は大丈夫ですが、不正な文字コードと判断された部分は変換されなかったりするはずなので、元がどうだったのかは、膨大な組み合わせパターンになると思います。実質無理。不正な文字コードが削除されたり、「?」に置き換えられたりする仕様なら原理的に復元不可能になりますね。 ということで、もし、Unix/Linux→Windowsであったのなら、 Unix/Linuxで、 perl -e 'undef $/;$_=<STDIN>;s/\r\n/\n/g;print;' <inputfile >outputfile で変換してみて、いければラッキー。だめならあきらめる。

その他の回答 (4)

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.5

他の方もおっしゃっていますが不可能です。 もし可能であるならftpサーバにASCIIモードでputして バイナリモードでgetすればいいですよね。 でもできないでしょ?

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.3

>今本来バイナリーとしてダウンロードすべきファイル(hogehoge.tar.gz)をASCIIモードでftpで取得してしまいました。 ダウンロードしたファイルは元のものと一致しませんので、正しい方法(binary)でダウンロードし直してください。 >このファイルをASCII ->binaryファイルに戻す方法はないでしょうか? ASCIIファイルは途中にEOF(End Of File)があるとそれから後は読み込まずに終了します。 Binaryファイルはファイルサイズ通りに取り込みますので元のファイルと同じです。 従って、コード変換だけではダウンロードしたファイルを修正できません。

  • chie65535
  • ベストアンサー率43% (8514/19356)
回答No.2

>多分改行コードや、文字コードを変換すればいいと思うのですが・・・ それは、論理的に不可能です。 プログラムは「変換後のバイト並びがあったら、変換前のバイト並びに入れ替える」という物になるでしょう。 もし、バイナリファイルの中に「元々、変換後のバイト並びと同じ並びの物があった」場合、変換をしてしまうと「変換後のバイト並びのまま変更しなくても良いのに、変換前のバイト並びに入れ替えられてしまう」と言う事が起きます。 具体例を出すと、以下のようになります。 例: 「こっちこい、こっちこい、いけのこい」と言う文章を考えます。(こっち来い、こっち来い、池の鯉) うっかり間違って、「こい」を「いけ」に変換してしまったとします。 文章は「こっちいけ、こっちいけ、いけのいけ」になります。 元に戻そうとして「いけ」を「こい」に再変換します。 文章は「こっちこい、こっちこい、こいのこい」になります。 どうです?元に戻りましたか?戻ってないですよね?「こいのこい」になってるの判りますか? このように、うっかりバイナリファイルをASCII変換してしまうと、逆変換を行っても、元に戻す事は不可能なのです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

あきらめてダウンロードし直してください.

関連するQ&A

  • なぜ sftp には ASCIIとBINARYといったモードがないのでしょうか?

    FTPには、 asciiとbinaryモードがありテキストファイルなどは asciiで転送すればプラットフォームに合わせて変換してくれますが、なぜ sftpにはそのようなモードがないのでしようか?

  • $マークの誤変換?について

    指定パスのJavaのクラスファイルを圧縮し、圧縮ファイルをサーバに配置して解凍するシェルスクリプトを作成しています。 クラスファイルのパスは、 ------------------------------ /***/***/***$$1.class /***/***/***$1.class /***/***/***$test.class /***/***/***hogehoge.class …(以下略) ------------------------------ 上記のような記述形式で一覧にし、file.listというファイル名でシェルスクリプトと同じ階層に配置しております。 クラスファイルの中には、内部抽象クラスとなっているものもあり、 "$"がファイル名に含まれています。 このファイル群を、tarコマンドで圧縮するシェルスクリプトを作成したいのですが、 tar cf - `cat file.list` とすると、$が異なる文字列に変換されてしまい、 tar:/***/***/***$$2752111.class:No such file or directory とエラーログが出力され、正しいパスが取得できていないようです。 どのように修正すれば、$を含むファイル名も正しく取得できるでしょうか? お知恵をお貸しください。よろしくお願いいたします。

  • バイナリで配布されているプログラムをインストールする際、ディストリビューションとか関係ないんですか?

    すみません。PC-UNIX初心者です。 今、FreeBSDとSolaris10とDebianとFedoraCoreが入っているんですが、とりあえず、プログラム開発環境を作りたいと思いまして、ApacheとPHPとMySQLをインストールしようとおもいました。 書籍の解説&CDには、tar.gz形式のファイルが入っていますが、どのディストリビューションでもこれらのバイナリファイルはインストール可能なんでしょうか?ディストリビューション特有のパッケージ(RPMなど)があることは、知っているんですが、よくサイトで配布されているtar.gz形式とかのバイナリファイルまたはソースファイルは、どのディストリビューションでもインストール可能なようにできているんでしょうか? そもそもLinuxとFreeBSDとかは構造および開発経緯が違う?から、一緒のファイル(この場合だとhogehoge.tar.gz)でインストールを行えるとは思いもよりませんでした。これは、カーネルが同じだからできるという解釈でいいんでしょうか?それともFreeBSDとLinuxではカーネルは違うんでしょうか? PC-UNIXはディストリビューション間で互換性を保とうとカーネルを同じにしているんでしょうか? 詳しい方、よろしくお願いします。

  • ftpでファイルアップロードさせるシェルスクリプト

    Linuxで、あるftpサーバーにファイルをアップロードするシェルスクリプトを作る方法を教えてください。 例えば、このようなftpサーバーに対して、以下のスクリプトを作りました。 ■ftpサーバー ftpサーバー:ftp.hogehoge.jp User-ID: user1 Password: password1 アップロードしたいファイル:test.html アップロードしたい場所:/public_html ■シェルスクリプト #!/bin/sh ftp ftp://user1:password1@ftp.hogehoge.jp -u /public_html test.html ■結果 エラーも何も表示せず。 シェルスクリプトを、このようにすると、ftpサーバーにログインはできています。 #!/bin/sh ftp ftp://user1:password1@ftp.hogehoge.jp ここで、以下のように手でファイルをアップロードすることはできています。 ftp> cd public_html 250 CWD command successful. ftp> put test.html local: test.html remote: test.html 227 Entering Passive Mode (210,132,253,13,218,1) 150 Opening BINARY mode data connection for test.html 100% |*************************************| 62 270.29 KB/s 00:00 ETA 226 Transfer complete. 62 bytes sent in 00:00 (1.78 KB/s) ■環境 クライアント側 SuSE Linux 9.3 man ftpを見て、-uを使うのだと思ったのですが、間違ってますでしょうか? よろしくお願いします。

  • 改行コード2つを1つに変換したいです

    HTMLをFTPでアップロードした際、アスキーとバイナリを間違えたのか改行が連続2つになってしまいました。 元のファイルを消してしまったため、改行コード2つを1つへ置換したいのですが実現できるWindowsソフトを探しているのですがCR+LFをLFに変換するソフトはあってもLF+LFをLFに変換するソフトが見当たりません。 実現できるソフトはありますでしょうか? ファイルがかなりたくさんあるので、ディレクトリ毎に置換できるソフトが希望です。

  • 解凍の仕方

    Linuxのレッドハット7.2を使っているのですが, ネットスケープ7.1をDLしたのですが, ファイル(gzで終っている)を解凍しようと思ったのですが, tarというコマンドを使ったのですが,うまく行かず manコマンドで使い方をみたのですが, 書式の読み方がよくわかりません。ファイル名は netscape-i686-pc-linux-gnu-installer.tar.gz というファイルです どうやった解凍できますでしょうか? 現在使っているネットスケープのバージョンは4.78です. お願いします。

  • FTPにより自動でファイルをサーバ間移動させたい

    シェルスクリプトの作成について初心者の者です サーバA(レンタルサーバ)のバックアップファイル(毎日生成)を ・サーバB(自作(Fedora-core4))から自動でFTP接続させて、 ・サーバAのバックアップファイルをサーバBにコピーして、 ・サーバAのバックアップファイルを消去しようとしています。 皆さんに色々教えていただいて下記(sample)のように記載して 下記の実行結果まできましたが最後の所でつまずいています。 コピー元(サーバA)にあるファイルに頭に「bak***」のつくファイルを すべてコピーしてきて、コピーしたあと、そのファイルを消去しようとしています 例えば、今日(9日)はbak-mysql-*********.sql.gzとbak-root********.tar.bz2 の2種類が(20121207、20121208、20121209)の6ファイルあります つまり、この6ファイルをコピーして、その後、削除させたいと思います それで、サーバAの/rootに下記のsample (ftp_all.sh)のスクリプトを置きました ********** sample (ftp_all.sh) ************************** #!/bin/csh -f #"@(#)ftp_all.sh 1995/07/01 Copyright(C)1995 ASH" # # name: ftp all files /usr/bin/ftp -n サーバAのIPアドレス << EOF user username password passive binary cd /home/city21/backup mget bak*.* mdelete bak*.* bye EOF ********************************************* その実行結果は次のとおりです *************** 実行結果 *********************** [root@linux ~]# sh ftp_all.sh Passive mode off. mget bak-mysql-20121207.sql.gz? mget bak-root-20121207.tar.bz2? mget bak-mysql-20121209.sql.gz? mget bak-root-20121209.tar.bz2? mget bak-mysql-20121208.sql.gz? mget bak-root-20121208.tar.bz2? [root@linux ~]# ****************************************************** この実行結果をみると ・20121207.sql.gz、20121207.tar.bz2、20121209.sql.gz、20121209.tar.bz、20121208.sql.gz、20121208.tar.bz  6ファイルともmgetでファイルをコピーしているかのようにみえます  しかし、実際に、サーバB側にコピーされているのは  上記の実行結果の最初の3ファイル、(20121207.sql.gz、20121207.tar.bz2、20121209.sql.gz)しかコピーされて  いません  また、mdeleteのコマンドが全く効いていません  何故なのか、どこを直せばいいのか教えていただければ幸いです  また、今回はスクリプトの中に  /usr/bin/ftp -n サーバAのIPアドレス << EOF  ・  ・  ・  EOF  としたのですが    ftp -n サーバAのIPアドレス << _EOD  ・  ・  ・  _EOD としている例もあります  このEOF とか _EODの意味も勉強したいのですが  どこかこのあたり解説しているものがあれば教えていただければ  幸いです  よろしくお願いします。

  • FTPについて

    いつもお世話になっております。 本日はFTPについて質問させていただきます。 WINDOWSXPを使っていて、そこにもともと入っていたFTPを使用しております。 そこでふと思ったのが、バイナリーかアスキーかのどちらでファイルのやり取りをしているのだろうということです。 WINDOWSとUNIXとでは改行コードが違うのでASCIIであげたいと思っているのですが、勝手に切り替わっているみたいなのです。 私はjavaのソース、クラスファイルをやりとりしています。 仕組みを教えてください。

  • ダウンロードするシェルスクリプトについて

    LINUXサーバAとBの2つあります Linux-Aでは/aaa/bbbの中に(bak-A-20120218tar.bz)と(bak-B-20120218.gz)と毎日バックアップファイルを作成しています Linux-Aの容量が多くなっては困るのでLinux-Bのサーバから (1)毎日、定時にLinux-Aにアクセスし、 (2)Linux-Aの(bak-A-20120218tar.bz)と(bak-B-20120218.gz)をLinux-Bにダウンロードしたあと (3)Linux-Aの(bak-A-20120218tar.bz)と(bak-B-20120218.gz)を消去する このプロセスをシェルスクリプトに記載してCron登録したいと思っています そこでそのスクリプトを次のように考えました ************シェルスクリプト********************************* open xxx.yyy.ne.jp ・・・Linux-Aのサーバへ接続 user mmmmm nnnnnnn ・・・Linux-Aのサーバへ接続 cd /aaa/bbb/ ・・・Linux-Aの該当フォルダに切り替え binary mget bak-*.* ・・・bak以下のワイルドカードを利用して抽出(?) mdelete bak-*.* ・・・bak以下のワイルドカードを利用して削除(?) bye *************************************************************** 上記の5-6行目のように、ワイルドカードを指定して、ダウンロードとかファイル の消去をしようとしたのですがうまくいきません ワイルドカードを利用したのはbak-以下が毎日変わるのでそれを指定(プログラム)するのが難しかったのでこれを考えました まず、mgetとかmdeleteは利用できないのでしょうか このワイルドカードが利用できるダウンロードなり消去できるコマンド等あれば 教えていたただけないでしょうか または、別のいい方法があれば教えていただければ幸いです

  • 書籍"BINARY HACKS"に関する技術的な質問

    書籍"BINARY HACKS"に関する技術的な質問 オライリージャパンから出版されていますBINARY HACKSに関して技術的な質問があります。 バイナリファイルをダンプするコマンド"od"の具体的使用例として17ページに、適当なバイナリファイルをC言語の配列に変換するというスクリプトが書かれています。 このスクリプトを実際のC言語で使用する際に、どんなC言語を書いたらいいのでしょうか。 「標準入力からバイナリファイルを読み取って、標準出力に変換した配列を出力する」というようなことが書籍に書かれていますが、このスクリプトをC言語内で呼び出して、配列を取得するまでの流れをC言語でどう書くのか教えていただきたいです。 宜しくお願いします。