CMD:*。*または単に*?


47

1990年代には*.*、MS-DOSでファイル名を表すために " "を使用していましたが*、最近では" " だけを使用するスクリプトを見てきました。実際に私が使用しているものに違いはありますか?


9
現在、内部コマンドおよび最新のコマンドラインユーティリティと同等であることが事実ですが*、ファイルマスクパラメーターを使用する一部の古いユーティリティは古いファイル一致関数を使用する場合があり、それらのマスクは同等ではありません。*.*cmd
AFH

@AFHトークンが等しいとは思いません。*.*トークンは、拡張子のファイルを返すべきではありません。
tuskiomi

1
@tuskiomi- 拡張子の*.* ないファイルを返すべきではないことに同意します。残念ながらそうです。Grawityの答えをご覧ください。
AFH

回答:


65

Windows 95およびNT 3.5が「長いファイル名」のサポートを導入して以来、ファイル名と拡張子は単一のフィールドであり、ワイルドカードの一致はファイル名全体に対して一度に行われます。その結果、ドットのないファイル名(ファイルでは珍しいかもしれませんが、フォルダ/ディレクトリでは非常に一般的です)を持つことができ、一見する*.*と実際にはそのようなファイルと一致しません。

互換性コードがあるため、使用している古いスクリプト*.* 引き続き機能します。ワイルドカードがで終わる場合.*、その部分はOSによって無視されます。(したがって、拡張子を持つファイル明確に一致さたい場合は*.?*、その必要があると思います。)

しかし、それはあなたが信頼すべきものではありません。最新のWindowsバージョン用のスクリプトを作成する場合は、MS-DOSの規則ではなく、その規則に従ってください。(のWindows NTのように、.BATスクリプトであることに注意してくださいではないもうMS-DOSには解釈されずにより、cmd.exeネイティブのWin32プログラム、。)


Linuxや他のさまざまなUnixenでは、名前&拡張子が最初の場所で別々の行ったことがないし、そこではないようにする特別な魔法の*.*仕事は、とても*理にかなっている唯一の選択肢です。


14
「拡張機能を使用してファイルのフィルタリングを困難にしましょう!
ジョンハミルトン

50
「みんなのために何百万もの既存のバッチスクリプトを壊しましょう!
ません-grawity

3
DOSの一部の古いバージョンでは、拡張子のない*ファイル名のみに一致するISTR 。両方と互換性のある「安全な」方法は、を使用することでした。**
Random832

8
OPはWindowsについてですが、Linuxについて説明したため:一部のシェル(Bashなど)では、*デフォルトで)隠しファイル名(で始まる)と一致しません.
フロリアンブラッカー

4
「OSレベル」の一部の値については、Windowsのシェル(エクスプローラー)の概念でもあります。カーネルは、実行可能ファイルの.exeも他のことも気にしません。WindowsエクスプローラーがLinuxのNautilusなどよりも「OSレベル」であるかどうかを議論することができます。
-grawity

11

それはおそらく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 *.*拡張子のないファイル(一致する可能性がありますが、間違っていると予想されます)が好きです。

このように要約しても安全だと思います。

  • CMDでは、ユーティリティによって異なります。
  • PowerShellでは、WildCardPatternクラスを使用するユーティリティは、posixy動作の一貫したサブセットを提供します。

もう1つの違いは、CMDではほとんどのプログラムが実際に生のワイルドカードをカーネル(FindFirstFile)に転送するのに対して、Linuxのglobは完全なリストを取得してユーザー空間でフィルタリングするだけです。
-grawity

100万個のファイルがあるディレクトリで*を実行すると、コマンドはパラメーターが多すぎることを訴えます。最悪の場合、リストの末尾が静かに削除される可能性があります。このような場合、2つ以上のコマンドをパイプするか、ファイルにファイル名のリストを保存して、他のプロセスがリストを読み取れるようにする必要があります。
エンリック海軍

3
@grawityより正確にするために、フィルタリングはWindowsのファイルシステムドライバーによって行われます。これは、ネットワークファイルシステム(特に、リモートファイルシステムに対して8 kbの行を実行できる場合)で特に役立ちますが、明示的にサポートされている検索だけでなく、任意の検索も実行できないことを意味します。これの意味は、レイモンド・チェンのブログで何度も調査されてきました。FindFirstFileそれ自体はユーザーモードです(kernel32.dllとntdll.dllはどちらもユーザーモードライブラリです-これはカーネルではなくWin32サブシステムの一部です)が、実際にはあまり機能しません。
ルアーン

ああ、FindFirstFileは似たような名前のsyscallをほぼ直接ラップしているという印象を受けました(libcのopen(3)がLinuxカーネルのopen(2)をちょうどラップするように)。
-grawity

1
@cup:引用符を使用して、シェルがグロブを展開しないようにします。これにより、コマンドに渡すことができます。例えば mmv "fred.*" "tom.#1"。(置換はの#1代わりに使用します*。これには、フィールドの順序を変更できるという利点があります)。 mmvほとんどのシステムにはデフォルトでインストールされていませんが、多くの場合、他のバッチ名変更ツールはインストールされています。それについてのこの記事stackoverflow.com/questions/417916/how-to-do-a-mass-renameを参照してください。
ピーターコーデス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.