相変わらず、騷しいう~さん
momiji

「ところで旦那、“長いパス” の検証データを放置しているのが気になりますね~」
『そやねん、7-Zip 任せというのも何やな、一肌脱ぐか』
「さすが、旦那」

「長いパス」対応の組み込みコマンド (nanoShell Tools)

1. 指定されたフォルダまたはファイルを複写します
 int copy( <[folder][/wildcard]>, <folder> [," [sync]"])
 int copy( <file>, <file> )
・サイズ / 日時 が異なるファイルのみ差分コピーします
・"sync" オプションを指定すると更に出力側にのみ存在するファイルを削除します(同期コピー)
   このメッセージは標準エラーに出力します (本体のメッセージは標準出力)

・ワイルドカード判定は、*、?、| を含む場合、
   または最後が ’.’ (ファイル名規約違反のため識別子として利用) の場合にワイルドカードと判断します
・ワイルドカードは、*→.*、?→.、.→\. に変換し、正規表現マッチします (大小文字を区別しない)
   こんな指定も可能です "[baz]*.txt|*.log"

・出力が (新規)フィオルダの場合は、"foo/" と指定します

2. 指定されたフォルダまたはファイルを移動(リネーム)します
 int move( <[folder][/wildcard]>, <folder>)
 int move( <file>, <file> )

3. 指定されたフォルダまたはファイルを削除します
 int remove( <folder | file [/wildcard]> [," [root]"])
・ルートフォルダを指定する場合は "root" オプションが必要です

4. 指定されたフォルダをコンパクトなツリー表示します
 int tree( <folder[/wildcard]> [, " [file]"])
・"file" を指定するとファイル名を表示します

5. ファイルを一覧表示します
 int ls( <folder[/wildcard]> [," [/*属性*/ 0 | , | k] [/*長いパス*/ 260 | no260] "])
・0: 編集なし、, : カンマ編集、K: 単位変換 (属性を表示するためにはいずれかを指定します)
・260: 長いパスを表示、no260: 短いパス、省略: 全て

6. 共通オプション
 リダイレクト: [12]>{1,2} path
・リダイレクトは ①後続のオプションが存在する場合は、シングルクオートで囲む仕様です >'path'
   これは後続の一般オプションを食ってしまうためで、②オプションの最後に指定または、
   ③リダイレクトのみ単独指定でも回避できます
   すなわち "/*オプション*/ 1>foo 2>bar /*ここにオプションは書けない*/ "

・パスは、80 桁に切り詰めますが、リダイレクトの場合はそのまま出力します

 リカーシブ: noRecursive
・オプションは大小文字を区別しないで前方一致で比較します (コマンド内でユニークなら良い)
   "foo", "bar" では煩雑になるため "foo bar" 形式を推奨します
   否定オプション noRecursive はマイナスオプション -r[ecursive] に短縮可能です

7. 復帰コード
 0: 正常、1: インフォーメーション、2: ワーニング(マゼンタ)、3: エラー(赤)
・重大エラーは、throw するためあまり意味を持た持たないため、警告に使用しています

8. 外部コマンド呼び出し
 int system("<command> [<args...>] [>redirect]")

9. PowerShell 呼び出し
 int system("PowerShell <command> [<args...>] [>redirect]")

10. コマンドプロンプト呼び出し
 int system("CMD /C <command> [<args...>] [>redirect]")

※ ソースコード: plus/io/NanoTools.java

テストスクリプト

※ シェルスクリプトの代わりに AWKスクリプト(nanoShell)で記述します
# nanoTools.awk
#
BEGIN {
   remove("W:/", "root re")
   remove("Z:/", "root re")

   print "## コピー"
   copy("./lib.zip", "W:/")
   copy("lib.zip", "W:/T/")
   copy("./lib.zip", "W:/lib2.zip")
   copy("lib*.zip", "W:/TMP/")
   ls("W:/", ", re")
   tree("W:/", "file re")

   print "## 移動"
   remove("Z:/*.zip", "root re")
   move("W:/lib.zip", "Z:/")
   move("W:/T/lib.zip", "Z:/T/lib.zip")
   print "# リダイレクト"
   copy("X:/", "W:/", "sync re >'Z:/cp( 1).tmp' 2>'Z:/cp(\'2).tmp' ")
   ls("Z:/*.tmp", "k re")
   print "foo" >"Z:/timeStamp"
   copy("X:/", "W:/", "sync re", ">Z:/cp( 3).tmp 2>Z:/cp(\'4).tmp")
   ls("Z:/*.tmp", "k re")
   move("W:/", "Z:/", "re")
   ls("Z:/", "k re")
}

スクリーンショット

path1path2 path3path4 path5

サンプル

※ ls の結果を読み、サイズの平均値を表示します
# nanoAverage.awk redirectFile
#
BEGIN {
   redirect = ARGV[1]
   ls("./*.html", "0   >" redirect)
   FS = "\t"
}
   {
   size += $2
   print
}
END {
   print "Number: " NR " Average size: " int(size / NR)
}
path6

まとめ

「旦那、“長いパスエラー” が出たらとりあえず “tree” ですね?」
『そや、簡単やろ!あとは nanoTools
、7-Zip、Winfile、Robocopy とかであんじょうやったらえぇねん』
『正月明けには次の記事でフォローするから楽しみにしといてや』

オープンソース

検証環境

  • Windows 10
  • Windows Terminal (オープンソース)、Windows PowerShell (オープンソース)
  • GNU Make (オープンソース)
  • Java 19 (オープンソース)
  • AWK˜plus for Java (オープンソース)

インストール

  1. Java をダウンロード(環境を汚さない .zip 版を推奨、複数の Javaもインストールできます)「Java Downloads」
  2. AWK~plus をダウンロード「AWK~plus for Java」 (コマンドを添付しています)
  3. AWK~plus フォルダ中の makefile の JAVAHOME 変数に Javaホームパスを設定します。

実行

ターミナルを開き、AWK~plus フォルダをカレントディレクトリにして、と入力します。

「Table of contents」 2022.12.27