Еще в 1990-х я использовал « *.*
» Для обозначения любого имени файла в MS-DOS, но я видел больше сценариев, использующих только « *
» в наши дни. Имеет ли это какое-то значение, какой я использую?
2 ответа
Имя и расширение файла были единым полем с тех пор, как в Windows 95 и NT 3.5 была введена поддержка "длинных имен файлов", и сопоставления с подстановочными знаками выполняются сразу для всего имени файла. В результате вы можете иметь имя файла без точек (возможно, редко для файлов, но очень часто для папок / каталогов) и на первый взгляд *.*
самом деле не будет совпадать с такими файлами.
Старые сценарии, использующие *.*
, Все равно будут работать из-за кода совместимости - если подстановочный знак оканчивается на .*
, Эта часть игнорируется ОС. (Так что, если вы хотите специально сопоставить файлы с расширением, я думаю, вам понадобится *.?*
для этого.)
Но на это не стоит полагаться; если вы пишете сценарии для современных версий Windows, следуйте их соглашениям, а не соглашениям MS-DOS. (Обратите внимание, что в Windows NT сценарии .bat больше не интерпретируются MS-DOS, а cmd.exe
, родной программой Win32.)
В Linux и других Unixen имя и расширение никогда не были разделены, и нет никакой особой магии, заставляющей *.*
Работать, поэтому *
это единственный выбор, который имеет смысл.
Вероятно, стоит упомянуть, что оболочки unixy/posixy, такие как shell bourne, bash, ksh, zsh и т.д., Выполняют расширение с подстановочными знаками (таких глобальных символов, как *
, ?
, [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.