47

Еще в 1990-х я использовал « *.* » Для обозначения любого имени файла в MS-DOS, но я видел больше сценариев, использующих только « * » в наши дни. Имеет ли это какое-то значение, какой я использую?

2 ответа2

65

Имя и расширение файла были единым полем с тех пор, как в Windows 95 и NT 3.5 была введена поддержка "длинных имен файлов", и сопоставления с подстановочными знаками выполняются сразу для всего имени файла. В результате вы можете иметь имя файла без точек (возможно, редко для файлов, но очень часто для папок / каталогов) и на первый взгляд *.* самом деле не будет совпадать с такими файлами.

Старые сценарии, использующие *.* , Все равно будут работать из-за кода совместимости - если подстановочный знак оканчивается на .* , Эта часть игнорируется ОС. (Так что, если вы хотите специально сопоставить файлы с расширением, я думаю, вам понадобится *.?* для этого.)

Но на это не стоит полагаться; если вы пишете сценарии для современных версий Windows, следуйте их соглашениям, а не соглашениям MS-DOS. (Обратите внимание, что в Windows NT сценарии .bat больше не интерпретируются MS-DOS, а cmd.exe , родной программой Win32.)


В Linux и других Unixen имя и расширение никогда не были разделены, и нет никакой особой магии, заставляющей *.* Работать, поэтому * это единственный выбор, который имеет смысл.

11

Вероятно, стоит упомянуть, что оболочки 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .