- 記事一覧 >
- ブログ記事
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)
構成
↑
おのおののケースで改めて図示しますが、基本的にこの構成とします。
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
本題から逸れますが、teraterm の場合、ファイル名をecho
したりls
すると、一部?表示になりました。vscode のターミナルや、Ubuntu のターミナルでは正常に表示されました。
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\
で見られるようになった想定です。
エクスプローラー
エクスプローラーでコピーします。
文字化けはしませんでした。
タイムスタンプは維持されました。
コピー時間は、1 分 52 秒でした。
xcopy コマンド
xcopy
でコピーします。
> powershell -C (Measure-Command {xcopy \\192.168.12.110\Share\dummy \\192.168.12.219\fileserver\dummy /I}).TotalSeconds
文字化けはしませんでした。
タイムスタンプは維持されました。
コピー時間は、1 分 57 秒でした。
robocopy コマンド
robocopy
でコピーします。
> powershell -C (Measure-Command {robocopy \\192.168.12.110\Share\dummy \\192.168.12.219\fileserver\dummy}).TotalSeconds
文字化けはしませんでした。
タイムスタンプは維持されました。
コピー時間は、1 分 38 秒でした。
FastCopy
FastCopy
という無料の高速ファイル・コピーツールをインストールして、コピーしました。
文字化けはしませんでした。
タイムスタンプは維持されました。
コピー時間は、1 分 9 秒でした。
※インストールしてすぐ起動して、何もチューニングしていません。
rsync
samba を使わない場合、コピーは、Windows 版 rsync で行うという手もあります。
https://itefix.net/cwrsync の以下の"Rsync client" - "download"タブのページからダウンロードします。
今回、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
前提が崩れますが、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 秒でした。
まとめ
コピー方法 | 実行時間 | 文字化け | タイムスタンプ | 差分コピー |
---|---|---|---|---|
scp | 3 分 48 秒 | 無し | 維持 | ❌ |
エクスプローラー | 1 分 52 秒 | 無し | 維持 | ❌ |
xcopy | 1 分 57 秒 | 無し | 維持 | ❌ |
robocopy | 1 分 38 秒 | 無し | 維持 | ✔ |
FastCopy | 1 分 9 秒 | 無し | 維持 | ✔ |
rsync | 3 分 35 秒 | 無し | 維持 | ✔ |
cp | 1 分 50 秒 | 無し | 維持 | ❌ |
その他、宣伝、誹謗中傷等、当方が不適切と判断した書き込みは、理由の如何を問わず、投稿者に断りなく削除します。
書き込み内容について、一切の責任を負いません。
このコメント機能は、予告無く廃止する可能性があります。ご了承ください。
コメントの削除をご依頼の場合はTwitterのDM等でご連絡ください。