1. 指定されたフォルダまたはファイルを複写する
int copy( <folder[/wildcard]>, <folder> [," [sync] [progress]"])
int copy( <file>, <file | folder> )
・
名前 / サイズ / 日時 が異なるファイルのみ差分コピーする
・
"sync" オプションを指定すると更に出力側にのみ存在するファイルを削除する(同期コピー)
このメッセージは標準エラーに出力する (本体のメッセージは標準出力)
・ワイルドカード判定は、
*、?、| を含む場合、
または最後が
’.’ (ファイル名規約違反のため識別子として利用) の場合にワイルドカードと判断する
・ワイルドカードは、
*→.*、?→.、.→\. に変換し、正規表現マッチする (大小文字を区別しない)
こんな指定も可能です
"[baz]*.txt|*.log"
・出力が (新規)フォルダの場合は、"foo/" と指定する
2. 指定されたフォルダまたはファイルを移動する
int move( <folder[/wildcard]>, <folder>) [," [progress]"])
int move( <file>, <file | folder> )
・"move"は入力側空フォルダ(Time0以外)を削除します
3. 指定されたフォルダまたはファイルを削除する
int remove( <folder [/wildcard]> [," [root] [progress]"])
int remove( <file>)
・ルートフォルダを指定する場合は "root" オプションが必要
・"remove"は空フォルダ(Time0以外)を削除します
4. 指定されたフォルダをコンパクトなツリー表示する
int tree( <folder[/wildcard]> [," [file]"])
・"file" を指定するとファイル名を表示する
5. ファイルを一覧表示する (listSegment)
int ls( <folder[/wildcard]> [," [path] | [0 | , | k] [260 | no260]"])
・ファイル長、0: 編集なし、, : カンマ編集、K: 単位変換 (属性を表示するためにはいずれかを指定する)
・path: ファイル長の代わりに パス長を sort キーとし使用するための編集("%, 7d")をして表示する
・260: 長いパスを表示、no260: 短いパス、省略: 全て
・ls はシェル連携をを考慮してタブ区切りで出力しています (日時、長さ、パス)
6. フォルダをクリーンアップする
int clean( [," [clean] [noTime]"])
・"clean" オプションは
空のフォルダを削除します
・"noTime"、標準ではフォルダ日時を子要素の日時に設定します(
空フォルダは Time0(日時0))
7. シェル変数を設定する
int set( [," [var=val] …"])
・
MAX_PATH=260 パスの最大長を指定する (tree、ls: 260、no260 オプションで使用)
・
DISPLAY_WIDTH=40 パスを画面に表示する幅
・オプションを省略すると一覧表示します
8. 共通オプション
プログレス: progress
・"copy", "move", "remove" で使用します
・リダイレクトと共存可能
リダイレクト: [12]>{1,2} path
・リダイレクトは
①後続オプションが存在する場合は、ファイル名をシングルクオートで囲む仕様です >'path'
これは後続の一般オプションを食ってしまうためで、
②オプションの最後に指定または、
③リダイレクト達のみの単独指定でも回避できます
すなわち
"/*オプション*/ 1>foo 2>bar /*ここにオプションは書けない*/ "
・パスは、DISPLAY_WIDTH 桁に切り詰めますが、リダイレクトの場合はそのまま出力します
リカーシブ: noRecursive
・オプションは大小文字を区別しないで前方一致で比較する (コマンド内でユニークなら良い)
"foo", "bar" では煩雑になるため "foo bar" 形式を推奨する
否定オプション noRecursive はマイナスオプション -r[ecursive] に短縮可能です
9. 復帰コード
0: 正常、1: インフォーメーション、2: ワーニング(マゼンタ)、3: エラー(赤)
・重大エラーは、throw するためあまり意味を持た持たないため、警告に使用しています
10. 外部コマンド呼び出し
int system("<command> [<args...>] [>redirect]")
11. PowerShell 呼び出し
int system("PowerShell <command> [<args...>] [>redirect]")
12. コマンドプロンプト呼び出し
int system("CMD /C <command> [<args...>] [>redirect]")
※ ソースコード: plus/io/NanoTools.java
ベンチマーク環境
- ソース: ミュージックデータ、1,773楽曲、180フォルダ、65.5GB
楽曲".flac"(可逆圧縮)はサイズが大きいため I/O効率が良い
- 入力: 内蔵 SSD
- 出力: 外付け(USB3.0) SSD
※
スクリプト
## nanoAsyncC.awk -v DISPLAY_WIDTH=n
#
var DISPLAY_WIDTH = 35
BEGIN {
DD = "D:/"
MM = "M:/"
INPUT = DD "ミュージック/"
OUTPUT = MM "ミュージック/"
print "\e[92m# copy コマンドでバックアップする\e[m"
set("DISPLAY_WIDTH="DISPLAY_WIDTH)
print "\e[92m# 前回のバックアップを削除\e[m"
remove(OUTPUT, "pro")
print "\e[92m# バックアップ\e[m"
copy(INPUT, OUTPUT, "pro")
}
※
make ファイル
nanoAC :
$(PLUS) sample/nanoAsyncC.awk -v DISPLAY_WIDTH=35
スクリーンショット
※ 結果は 4:09秒です
ファイルI/O は nio.Files#copy/move で実装しておりコードは 1step です
"Files" のバッファサイズが気になったためファイルを一気にI/Oしてみました
※
結果は 8:19秒です
丁度、倍遅いです。ということは
非同期 I/O(スレッド)を使っているということです ^^);
Robocopy (Windows標準)
※
バッチファイル
robocopy.exe D:\ミュージック M:\ミュージック /E /MIR /DCOPY:DAT /R:1 /NP /NFL /NDL /LOG:.\robocopy.log
※
結果は 3:53秒で、16秒差、射程距離内ですかね?
FastCopy
※ 結果は 3:14秒(最速)です
設定画面を開くと小さなファイルはキャッシュする、非同期I/O=8 といった項目が並んでいます
Robocopy と比べて欠点はフォルダ・ファイルへの属性設定が限られていることです