回答:
Windows 95およびNT 3.5が「長いファイル名」のサポートを導入して以来、ファイル名と拡張子は単一のフィールドであり、ワイルドカードの一致はファイル名全体に対して一度に行われます。その結果、ドットのないファイル名(ファイルでは珍しいかもしれませんが、フォルダ/ディレクトリでは非常に一般的です)を持つことができ、一見する*.*
と実際にはそのようなファイルと一致しません。
互換性コードがあるため、使用している古いスクリプト*.*
は引き続き機能します。ワイルドカードがで終わる場合.*
、その部分はOSによって無視されます。(したがって、拡張子を持つファイルと明確に一致させたい場合は*.?*
、その必要があると思います。)
しかし、それはあなたが信頼すべきものではありません。最新のWindowsバージョン用のスクリプトを作成する場合は、MS-DOSの規則ではなく、その規則に従ってください。(のWindows NTのように、.BATスクリプトであることに注意してくださいではないもうMS-DOSには解釈されずにより、cmd.exe
ネイティブのWin32プログラム、。)
Linuxや他のさまざまなUnixenでは、名前&拡張子が最初の場所で別々の行ったことがないし、そこではないようにする特別な魔法の*.*
仕事は、とても*
理にかなっている唯一の選択肢です。
*
ファイル名のみに一致するISTR 。両方と互換性のある「安全な」方法は、を使用することでした。**
それはおそらくunixyの/ etc Bourneシェルは、bash、kshの、zshの、のようなposixyシェルが(グロブ文字が好きなのワイルドカード拡張を行うことを言及する価値があります*
、?
、[range]
、[!range]
およびその他の拡張ブレースと拡張グロブのような)は、引数のリストをコンパイルする前に、コマンド実行されます。したがって、この展開は、これらが引数となるコマンドではなく、シェルによって行われます。
つまり、シェルは何のために責任がある*
、*.*
に展開します
$ ls
file.csv file.doc file.pdf file.txt file.xlsx zz-file-without-extension
$ (set -xv; foo *) # is actually expanded to the following
+ foo file.csv file.doc file.pdf file.txt file.xlsx zz-file-without-extension
$ (set -xv; foo *.*) # note this does not match `zz-file-without-extension`
+ foo file.csv file.doc file.pdf file.txt file.xlsx
これは、実行されたコマンドにグロブ文字を逐語的に渡すため、CMD(およびpowershellユーティリティの場合)には当てはまりません-したがって、拡張はシェルではなくコマンド/ユーティリティの責任です。したがって、最終的には、ユーティリティに何を*.*
または*
手段を任せて、慣習に準拠する(またはしない)ままにします。そのため、CMDのユーティリティは、dir *.*
拡張子のないファイル(一致する可能性がありますが、間違っていると予想されます)が好きです。
このように要約しても安全だと思います。
FindFirstFile
それ自体はユーザーモードです(kernel32.dllとntdll.dllはどちらもユーザーモードライブラリです-これはカーネルではなくWin32サブシステムの一部です)が、実際にはあまり機能しません。
mmv "fred.*" "tom.#1"
。(置換はの#1
代わりに使用します*
。これには、フィールドの順序を変更できるという利点があります)。 mmv
ほとんどのシステムにはデフォルトでインストールされていませんが、多くの場合、他のバッチ名変更ツールはインストールされています。それについてのこの記事とstackoverflow.com/questions/417916/how-to-do-a-mass-renameを参照してください。
*
、ファイルマスクパラメーターを使用する一部の古いユーティリティは古いファイル一致関数を使用する場合があり、それらのマスクは同等ではありません。*.*
cmd