1. 記事一覧 >
  2. ブログ記事
category logo

Ubuntu-Windows間コピー方法いろいろ 全日本語文字検証

(更新) (公開)

Ubuntu(に限らず Linux 全般) - Windows を相互にファイルを共有する方法がいろいろあります。今回、いろいろなコピー方法、ファイル名が文字化けしないかの確認と、コピースピードについて検証しました。文字化けについては、Unicode の日本語範囲全て確認しました。

【検証環境】

Ubuntu 20.04.2 LTS(コピー元)

 PHP 8.0.12

 samba 4.11.6-Ubuntu

 rsync 3.1.3

Windows 10 Pro x64(操作端末)

 FastCopy v3.92

 cwrsync_6.2.3_x64_free

Windows Server 2019 Datacenter Desktop(ファイルサーバー、NAS)


構成

Ubuntu - Windows 間コピー 構成


おのおののケースで改めて図示しますが、基本的にこの構成とします。


Linux をいじれる人、Windows(操作端末)をいじれる人、ファイルサーバー、NAS をいじれる人が別々にいて、最終的に Windows(操作端末)をいじれる人でコピー作業を行う想定です。(最後の mount は例外ケースです。)


日本語文字化け検証

ファイル名が文字化けしていたら、共有方法として使えないと思い、検証してみましたが、全ての方法で問題無く転送できました。
Ubuntu(Linux)側が UTF-8 以外の SJIS 等他の文字コードの場合、いろいろと問題が生じると思われます。


コピー先が日本語 Windows なので、日本語のファイル名だけテストしました。
Unicode のどの範囲が日本語なのか?ふと疑問に思い、調べると、意外と情報が無く、英語のサイトに明確に書かれていました。
http://www.localizingjapan.com/blog/2012/01/20/regular-expressions-for-japanese-text/


サイトに書かれている通り、以下の範囲の文字を検証対象としました。
ひらがな: 0x3041-0x3096
全角カタカナ: 0x30A0-0x30FF
漢字: 0x3400-0x4DB5、0x4E00-0x9FCB、xF900-0xFA6A
漢字部首: 0x2E80-0x2FD5
半角カタカナ: 0xFF5F-0xFF9F
日本語の記号と句読点: 0x3000-0x303F
その他の日本語の記号と文字: 0x31F0-0x31FF、0x3220-0x3243、0x3280-0x337F
全角英数字と句読点: 0xFF01-0xFF5E
上記すべての範囲の日本語をファイル名に使用したダミーファイルを出力するプログラムを作成しました。


[Unicode]_[文字]というファイルを1個100KBで28469個作成するphpプログラム:

<?php
for ($i = 0x3041; $i <= 0xff5e; $i++) {
    if (
        (0x3041 <= $i && $i <= 0x3096) ||
        (0x30a0 <= $i && $i <= 0x30ff) ||
        (0x3400 <= $i && $i <= 0x4db5) ||
        (0x4e00 <= $i && $i <= 0x9fcb) ||
        (0xf900 <= $i && $i <= 0xfa6a) ||
        (0x2e80 <= $i && $i <= 0x2fd5) ||
        (0xff5f <= $i && $i <= 0xff9f) ||
        (0x3000 <= $i && $i <= 0x303f) ||
        (0x31f0 <= $i && $i <= 0x31ff) ||
        (0x3220 <= $i && $i <= 0x3243) ||
        (0x3280 <= $i && $i <= 0x337f) ||
        (0xff01 <= $i && $i <= 0xff5e)
    ) {
        $filename = dechex($i) . "_" . mb_chr($i, "UTF-8");
        $cmd = "dd if=/dev/random of=" . $filename . " bs=1024 count=" . 100;//100KB
        system($cmd);
    }
}

10文字ずつのUnicodeをファイル名に使用する版(1個1MB×2846個):

<?php
$count = 0;
$filename = "";
for ($i = 0x3041; $i <= 0xff5e; $i++) {
    if (
        (0x3041 <= $i && $i <= 0x3096) ||
        (0x30a0 <= $i && $i <= 0x30ff) ||
        (0x3400 <= $i && $i <= 0x4db5) ||
        (0x4e00 <= $i && $i <= 0x9fcb) ||
        (0xf900 <= $i && $i <= 0xfa6a) ||
        (0x2e80 <= $i && $i <= 0x2fd5) ||
        (0xff5f <= $i && $i <= 0xff9f) ||
        (0x3000 <= $i && $i <= 0x303f) ||
        (0x31f0 <= $i && $i <= 0x31ff) ||
        (0x3220 <= $i && $i <= 0x3243) ||
        (0x3280 <= $i && $i <= 0x337f) ||
        (0xff01 <= $i && $i <= 0xff5e)
    ) {
        $count++;
        $filename .= mb_chr($i, "UTF-8");
        if ($count == 10) {
            $count = 0;
            $cmd = "dd if=/dev/random of=" . $filename . " bs=1024 count=" . 1024;//1MB
            system($cmd);
            $filename = "";
        }
    }
}

ファイル数が多すぎると、コピーに時間がかかるため、10 文字ずつの Unicode をファイル名に使用する版で検証することにしました。


Ubuntu で以下のようにダミーデータを作成しました。

mb_chrを使っていますので、phpは、7.2.0以上が必要です。

/home/share/create_all_Japanese_Unicode_DummyFiles2.php にプログラムを配置して、システムロケールを LANG=ja_JP.UTF8 と変更し、実行します。

# apt install language-pack-ja
# update-locale LANG=ja_JP.UTF8
# mkdir -p /home/share/dummy
# cd /home/share/dummy
# php ../create_all_Japanese_Unicode_DummyFiles2.php
# ls

VSCode 10文字ずつのUnicodeをファイル名に使用 ls


本題から逸れますが、teraterm の場合、ファイル名をechoしたりlsすると、一部?表示になりました。vscode のターミナルや、Ubuntu のターミナルでは正常に表示されました。

teraterm 10文字ずつのUnicodeをファイル名に使用 ls


ubuntu 10文字ずつのUnicodeをファイル名に使用 ls


scp

Ubuntu - Windows 間コピー scp

単発の作業の場合、scp を使うと、Windows 側、Linux 側何も準備しなくてもコピーできます。
ただし、今回試した方法では一番遅かったです。

> scp -rp admin@192.168.12.110:/home/admin/dummy //192.168.12.219/fileserver/

文字化けはしませんでした。
タイムスタンプは維持されました。
コピー時間は、3 分 48 秒でした。


samba Linux→Windows→NAS

Windows 端末から Linux のファイルを共有できるように samba をインストールします。

# apt install samba -y
# mkdir /home/share
# chmod 777 /home/share
# vi /etc/samba/smb.conf
[Share]
   # 共有フォルダーを指定
   path = /home/share
   # 書き込みを許可する
   writable = yes
   # ゲストユーザー (nobody) を許可する
   guest ok = yes
   # 全てゲストユーザーとして扱う
   guest only = yes
   # ファイル作成時のパーミッションを [777] とする
   force create mode = 777
   # フォルダー作成時のパーミッションを [777] とする
   force directory mode = 777
# systemctl restart smbd

以降、Windows 端末から Linux 側が \\192.168.12.110\Share\ で見られるようになった想定です。


エクスプローラー

Ubuntu - Windows 間コピー samba エクスプローラー

エクスプローラーでコピーします。

Ubuntu - Windows 間コピー エクスプローラー

文字化けはしませんでした。
タイムスタンプは維持されました。
コピー時間は、1 分 52 秒でした。


xcopy コマンド

Ubuntu - Windows 間コピー samba xcopy

xcopyでコピーします。

> powershell -C (Measure-Command {xcopy \\192.168.12.110\Share\dummy \\192.168.12.219\fileserver\dummy /I}).TotalSeconds

文字化けはしませんでした。
タイムスタンプは維持されました。
コピー時間は、1 分 57 秒でした。


robocopy コマンド

Ubuntu - Windows 間コピー samba robocopy

robocopyでコピーします。

> powershell -C (Measure-Command {robocopy \\192.168.12.110\Share\dummy \\192.168.12.219\fileserver\dummy}).TotalSeconds

文字化けはしませんでした。
タイムスタンプは維持されました。
コピー時間は、1 分 38 秒でした。


FastCopy

Ubuntu - Windows 間コピー samba FastCopy

FastCopyという無料の高速ファイル・コピーツールをインストールして、コピーしました。

Ubuntu - Windows 間コピー FastCopy画面

文字化けはしませんでした。
タイムスタンプは維持されました。
コピー時間は、1 分 9 秒でした。
※インストールしてすぐ起動して、何もチューニングしていません。


rsync

Ubuntu - Windows 間コピー rsync

samba を使わない場合、コピーは、Windows 版 rsync で行うという手もあります。


https://itefix.net/cwrsync の以下の"Rsync client" - "download"タブのページからダウンロードします。

Ubuntu - Windows 間コピー Windows 版 rsync


今回、cwrsync_5.5.0_x86_free.zipを使いました。
cwrsync_6.2.3_x64_free.zip
cwrsync_6.2.2_x64_free.zip
cwrsync_6.2.1_x64_free.zip
cwrsync_6.2.0_x64_free.zip
の場合、コピー先ディレクトリのパーミッションがおかしくなって、

rsync: [receiver] failed to set times on "//192.168.12.219/fileserver/dummy/.リルレロヮワヰヱヲン.PnHmYc": Permission denied (13)

とエラーになりました。


cwrsync_5.5.0_x86_free.zipを展開します。
展開すると、cwrsync.cmdというファイルが有るのですが、それの一番下の方を以下のようにします。

REM ** CUSTOMIZE ** Enter your rsync command(s) here
rsync -av 192.168.12.110::TEST //192.168.12.219/fileserver/dummy

Linux 側で rsync の設定をして、デーモンモードで起動します。今回使用した Ubuntu の環境には、rsync が最初からインストールされていました。

# /usr/bin/rsync --version
rsync  version 3.1.3  protocol version 31
# vi /etc/rsyncd.conf
uid = root
gid = root
use chroot = false
hosts allow = *
hosts deny = *
[TEST]
path = /home/share/dummy
read only = true
# rsync --daemon --config /etc/rsyncd.conf

Windows 側で rsync クライアントを起動します。

> cd C:\Users\admin.AD\Documents\cwrsync_5.5.0_x86_free
> cwrsync

文字化けはしませんでした。
タイムスタンプは維持されました。
コピー時間は、3 分 35 秒でした。


mount Linux→Windows

Ubuntu - Windows 間コピー cifs cp

前提が崩れますが、Linux から直接ファイルサーバー、NAS をマウントできます。
まず、ファイルサーバー、NAS をマウントします。

# apt install cifs-utils
# mkdir /mnt/windows
# mount -t cifs -o user=admin,password=passwd //192.168.12.219/fileserver /mnt/windows

/mnt/windows として、見えるので、普通にcpコマンドでコピーします。

# /usr/bin/time cp -rp /home/share/dummy /mnt/windows/dummy

文字化けはしませんでした。
タイムスタンプは維持されました。
コピー時間は、1 分 50 秒でした。


まとめ

コピー方法実行時間文字化けタイムスタンプ差分コピー
scp3 分 48 秒無し維持
エクスプローラー1 分 52 秒無し維持
xcopy1 分 57 秒無し維持
robocopy1 分 38 秒無し維持
FastCopy1 分 9 秒無し維持
rsync3 分 35 秒無し維持
cp1 分 50 秒無し維持

loading...