としおの読書生活

田舎に住む社会人の読書記録を綴ります。 主に小説や新書の内容紹介と感想を書きます。 読書の他にもワイン、紅茶、パソコン関係などの趣味を詰め込んだブログにしたいです。

カテゴリ: PC

先日、Windowsで初めてrobocopyコマンドを使ってファイルをコピーする機会がありました。

その際にファイルを速くコピーする方法を調べたので忘備録として記録します。



robocopyの基礎


robocopyコマンドはファイルサーバ同士の同期を目的に作られたコマンドです。

robocoyは「Roubust File Copy」の略で確実なファイルコピーという意味を持ちます。

FastCopyなどと違いWindowsに標準装備としてインストールされています。


ファイルをコピーす方法


robocopyでは以下のコマンドでファイルをコピーすることができます。

robocopy コピー元 コピー先



robocopyのオプション


robocopyのオプションはコマンドプロンプトで以下のコマンドを入力することで確認することができます。

robocopy /?

今回は、その中でも代表的なオプションをいくつか紹介します。

オプション説明
/MT[:n]n個のスレッドのマルチスレッドでコピーする。スレッドの数は1~128までの値
/MIR前回から更新のあったファイルだけコピーする。
/R:n失敗したコマンドに対してn回再試行する。
/W:n再試行と再試行の間にn秒待機時間を持たせる。
/NP進行状況を表示しない。

個人的に使ってみた感じ上記のオプションさえしっていれば基本的には困りませんでした。





ファイルを高速でコピーする


まずはオプションを変更してできる限りファイルを高速でコピーする方法を紹介します。

個人的に色々調べてみたところ以下のコマンドを使えばデフォルトでrobocopyコマンドを使うより、ファイルを速くコピーすることができました。

robocopy コピー元 コピー先 /MT:8 /MIR /R:1 /W:1 /NP

/Rや/Wオプションはデフォルト値が大きいのでかなり短くしています。

/MTオプションは環境によってチューニングが必要ですね。


今回、以下のようなディレクトリ構成で各フォルダに2KBのファイルを10000個ずつ入れて、コピーの毒度をrobocopyコマンドで計測してみました・

C:\TEST
├─1
├─10
├─2
├─3
├─4
├─5
├─6
├─7
├─8
└─9


計測結果は、24.0555624秒でした。


ちなみに上記でコピーしたフォルダにもう一度同じフォルダをコピーしてみようとしたところ、0.3133898秒で終わりました。

/MIRのオプションが有効に働いていますね。



startコマンドを使ってより早くしてみる


先ほどの計測結果よりも早くしようと思い調べてみたところ、startコマンドを使ったら早くなると書かれていたので試してみました。

一つのフォルダに対して一つのアプリケーションを起動してみます。

batファイルは以下になっています。

start robocopy C:\test\1 C:\test2\1 /MT:1 /MIR /R:1 /W:1 /NP
start robocopy C:\test\2 C:\test2\2 /MT:1 /MIR /R:1 /W:1 /NP
start robocopy C:\test\3 C:\test2\3 /MT:1 /MIR /R:1 /W:1 /NP
start robocopy C:\test\4 C:\test2\4 /MT:1 /MIR /R:1 /W:1 /NP
start robocopy C:\test\5 C:\test2\5 /MT:1 /MIR /R:1 /W:1 /NP
start robocopy C:\test\6 C:\test2\6 /MT:1 /MIR /R:1 /W:1 /NP
start robocopy C:\test\7 C:\test2\7 /MT:1 /MIR /R:1 /W:1 /NP
start robocopy C:\test\8 C:\test2\8 /MT:1 /MIR /R:1 /W:1 /NP
start robocopy C:\test\9 C:\test2\9 /MT:1 /MIR /R:1 /W:1 /NP
start robocopy C:\test\10 C\test2\10 /MT:1 /MIR /R:1 /W:1 /NP

計測結果は、24.476545でした。

あれ早くない!?スレッドの数とか調整したら早くなるのかな…。



まとめ


robocopyコマンドを使えばバックアップを速くできることが分かりました。

毎日や毎週のように短い頻度でバックアップをとっている場合、robocopyコマンドの/MIRオプションが有効に働くことも分かりました。

コピーコマンドで困った際は、ぜひrobocopyコマンドを使ってみてください。






バッチファイルを使って、試験に使用する大容量ファイルを作成してみました。



やりたいこと


今回は自分で作成したソフトの試験で10万行のファイルを読み込むという試験を行いたかったので、以下のようなファイルをバッチファイルで作成したかった。

abc
def
0123456789
0123456789
0123456789
0123456789
以下10万回『0123456789』が続く

ちなみにファイルの内容は、サンプル用の適当なものです。



ファイルに書き込む



上書き


以下のようにechoコマンドを使用して、出力したい内容とファイル名を指定することができます。

echo 出力したい内容> ファイル名

以下に上書きの場合のバッチファイルのサンプルを記しておきます。

バッチファイル
echo 123> ./test.txt 
echo 456> ./test.txt 

出力
456



追記


上書きから「>」の部分を「>>」に変更すると追記になります。

echo 出力したい内容>> ファイル名 

以下に追記の場合のバッチファイルのサンプルを記しておきます。

バッチファイル
echo 123>> ./test.txt 
echo 456>> ./test.txt

出力
123
456



for文


バッチファイルではfor文は以下のようにして書くことができます。

for /l %%変数 in (開始値,増減値,終了値) do (
    処理
)

これを先ほどのファイル出力のコマンドと組み合わせると以下のようになります。

バッチファイル
for /l %%i in (1,1,5) do (
    echo abc>> ./test.txt
)




試験用ファイルを作成する


先ほど説明したコマンドを組み合わせて、最初にやりたいことで示したファイルを作成してみます。

バッチファイル
rem 試験用ファイルを作成する
@echo off

echo abc>> ./test.txt
echo def>> ./test.txt
for /l %%i in (1,1,100000) do (
    echo 0123456789>> ./test.txt
)




まとめ


バッチファイルで試験用のファイルを作成してみましたが、コンパイルなどがいらないので単純なファイルを作るのには便利だなと思いました。



Ryzenの純正CPUファンのLEDを制御しようと思い、Wraith Prismを起動しようとしたところ以下の画面から動かず起動できませんでした。

キャプチャ

この問題の対処法を以下に記していきます。



【目次】
対処法
まとめ




Wraith Prismが起動しない問題の対処法


結論からになりますがケーブルをさし忘れていたため、ソフトウェアがCPUクーラーを認識できなかったことがWraith Prismが起動しない原因でした。

CPUクーラの箱の中に以下のようなケーブルがあります。

PXL_20210503_013357623


これをCPUファンとマザーボードに差し込んでください。

PXL_20210503_013602436

するとWraith Prismが起動してCPUファンのLEDを制御できるようになります。

キャプチャ



まとめ


Wraith Prismが起動しない原因はケーブルのさし忘れでした。

きちんと説明書は読むべきですね…。




M1 Macにanacondaをインストールしたので、インストール手順をまとめました。



M1 Macにanacondaをインストール


まずは以下のサイトからMac用のanacondaのインストーラをダウンロードします。

https://www.anaconda.com/products/individual#Downloads


スクリーンショット 2021-04-17 12.32.40

ダウンロードが完了したらanacondaのインストーラを起動し、許可を選択します。

スクリーンショット 2021-04-17 12.07.03

続けるをクリック
スクリーンショット 2021-04-17 12.07.23

続けるをクリック

スクリーンショット 2021-04-17 12.11.25

続けるをクリック

スクリーンショット 2021-04-17 12.11.40

インストール先にこだわりがなければインストールをクリック。

こだわりがある場合は、変更してください。

スクリーンショット 2021-04-17 12.13.10

インストールが完了するまで待機し、完了したら続けるをクリック。

スクリーンショット 2021-04-17 12.15.13

スクリーンショット 2021-04-17 12.16.17

以上でインストールが完了です。閉じるをクリックしましょう。

スクリーンショット 2021-04-17 12.17.30

ancondaがきちんとインストールされているのかを確認するためにターミナルで確認しましょう。

ターミナルを起動して”anaconda --version”とコマンドを入力するとanacondaのバージョンが表示されます。

バージョンが表示された場合、正しくanacondaがインストールできていることになります。

スクリーンショット 2021-04-17 12.22.40



まとめ


今回anacondaをインストールしましたがM1 Macだからと言って特別な手順はありませんでした。

とりあえず簡単にPython環境を構築できたのでよかった!













code-1839406_640


シェルスクリプト内でsudoコマンドを使用したいことがあり、使う方法を調べたところexpectコマンドを使用すればよいと分かりました。

使い方を防備録として記録します。





シェルスクリプトの中でsudoコマンドを使う方法


最初に結論からになりますが、以下のスクリプトでできます。
#!/bin/sh

PW="password"

expect -c "
set timeout 1
spawn sudo su
expect \"password:\"
send \"${PW}\n\"
expect \"$\"
exit 0
"

passwordには自分のパスワードを入力してください。






expectコマンドについて


簡単にexpectコマンドについて紹介します。

expectは対話を自動化するコマンドです。

expectコマンドを使おうとして、『expect コマンドが見つかりません』というエラーが出た場合は、以下のコマンドでインストールしましょう。
apt-get install expect

上記のスクリプトでは以下の5つのexpectコマンドを使用しています。


コマンド説明
set timeoutタイムアウトの秒数を指定する。
今回の場合、「password:」という文字列が出現しない場合、1秒後にタイムアウトする。
expectマシンからの応答を読み取り、パターンマッチした場合にexpectより下のコマンドを実行する。
今回の場合、sudoコマンドを実行すると「password:」という文字列が現れるので、出現後にパスワードを送信するために使用している。
spawnexpect内でプロセスを生成するコマンド。
今回の場合、sudoコマンドを実行している。
sendマシンに文字列を送信するコマンド。
今回の場合、sudoコマンドで必要なパスワードを送信している。
exitexpectの処理を終了させる。
数値を指定することで返り値として返すことができる。


この5つのコマンドを使いこなせば、シェルスクリプト内でsudoを使う他に、様々なスクリプトを自動化することができます。




最後に


シェルスクリプトの中でsudoコマンドを使用するという特殊なケースはなかなかないかもしれませんが、誰かの参考になれば幸いです。

この記事を見ている人の中でもっといい方法を知っている方がいましたらコメントで教えてください。



↑このページのトップヘ