86401
昔勉強のためにたてた ubuntu LINUX のPCがあるんですが  
最近使ってなくてスペックもしょぼいので home にあるファイルだけバックアップして止めようと思ってます

* * *

ssh は windows => linux にだけできる状態です

まず Winscp っていうGUI から ssh 接続できるアプリで  
home directory ごとフォルダをドラッグ＆ドロップしてみたんですが  
途中で固まってしまいました

* * *

windows terminal 上で  
`scp -r xxx:. .`  
とやるとやはり途中で固まってしまいます  
ファイルに ? がはいってるところでとまるのでそのせいかなと思ってます

* * *

次に Linux 内に入って  
`tar cvjf /tmp/home.tar.bz2 *`  
でアーカイブにして

`scp xxx:/tmp/home.tar.bz2 .`  
でコピーまではできました

windows 上には bzip2 がないので lhaz っていうソフトで解凍したんですが  
進捗ゲージ半分ぐらいのところで特にエラーもなく終わって  
ファイル数が 1700 ぐらいあるはずなのに find してみると 800 ぐらいしかファイルが見つかりません  
しかも日本語ファイルが文字化けて全然違うファイル名になってしまいます

ファイル名が大文字小文字で別ファイルがあったら windows 上で同じファイルになっちゃうのでしょうがないんですがどうもそうではないようです

どうにかして windows にディレクトリまるごと持ってくる方法ってありませんか？

* * *

Linux は 4.4.0-211-generic #243-Ubuntu SMP  
Windows は 10 です
CC BY-SA 4.0
2022-02-16T18:21:54.507
86400
2022-02-21T05:55:01.780
2022-02-21T05:55:01.780
3060
question
linux windows 文字化け
UNIX上のフォルダをWindows上にコピーしたい
> 日本語ファイルが文字化けて全然違うファイル名になってしまいます

Linuxを含むUNIXのファイルシステムには日本語ファイル名という概念がありません。`\0`と`/`以外の任意のバイト列でファイル名を構成することができ、その解釈は実行する個々のプログラムに任せられています。しかも昔は
**EUC-JP** というエンコーディングが使われていましたが、最近は **UTF-8** が使われているようです。  
この前提があるため、ファイルを扱う`tar`や`scp`なども特にファイル名を解釈することなく任意のバイト列として右から左に受け流しています。

対してWindowsは違います。Unicode（UTF-16）で管理されており、Unicodeでないバイト列についての解釈もコントロールパネルで指定するようになっていて、日本語の場合、
**Shift-JIS** が使用されます。

このような事情があるため、ファイル名について意識しないUNIX系のツールを使用してWindowsにファイルを持ち込むと文字化けします。

* * *

例えば転送にzip形式を使うのはどうでしょうか？ zip形式はファイル名にUnicodeを使用することができます。

[zip(1)](https://linux.die.net/man/1/zip)によりますと

```

    zip archive dir -r -UN=UTF8
    
```

等で、ファイル名をUTF-8として扱い格納できるようです。

* * *

> windows 上には bzip2 がないので lhaz っていうソフト

~~外部ツールは必要ありません。Windowsに標準搭載されている`tar`でもbzip2形式を扱えます。~~  
また、tarには複数のファイル形式があり、 **POSIX 1003.1-2001 (pax) format** はファイル名としてUTF-8を扱えます。  
zipと異なりtarの場合、パイプラインで処理可能です。Windows側で次の１行で転送可能かもしれません。

```

    ssh hoge@server "tar cjf - --posix -C /home/hoge/dir ." | tar xjf - -C C:/Users/fuga/dir
    
```

（なお、PowerShellの場合、パイプラインにバイナリデータを通せないため、コマンドプロンプトを使う必要があります）

追記： 失礼しました。Windows付属の`tar`は

```

    bsdtar 3.5.2 - libarchive 3.5.2 zlib/1.2.5.f-ipp
    
```

とのことで、zlibは組み込まれていますが、bzip2/xz/lzmaはライブラリが組み込まれておらず、直接は扱えませんでした。圧縮するならzlibを使い次のようになります。

```

    ssh hoge@server "tar czf - --posix -C /home/hoge/dir ." | tar xzf - -C C:/Users/fuga/dir
    
```
CC BY-SA 4.0
2022-02-16T21:16:30.657
86401
2022-02-17T20:54:33.310
2022-02-17T20:54:33.310
4236
4236
86400
answer