W latach 90. używałbym „ *.*
” do reprezentowania dowolnej nazwy pliku w MS-DOS, ale widziałem więcej skryptów używających teraz „ *
”. Czy to rzeczywiście robi różnicę, którego używam?
command-line
Foebane
źródło
źródło
*
i*.*
obecnie odpowiednik dlacmd
poleceń wewnętrznych i nowoczesnych narzędzi wiersza polecenia, niektórych starszych narzędzi, które mają parametry masce plików można używać starszych funkcji dopasowywania plików, a dla nich maski nie będą równoważne.*.*
Żeton nie powinien wrócić pliki bez rozszerzeń.*.*
nie powinny zwracać plików bez rozszerzeń. Niestety tak jest. Zobacz odpowiedź Grawity.Odpowiedzi:
Nazwa pliku i rozszerzenie są jednym polem , odkąd systemy Windows 95 i NT 3.5 wprowadziły obsługę „długich nazw plików”, a dopasowanie symboli wieloznacznych odbywa się jednocześnie dla całej nazwy pliku. W rezultacie możesz mieć nazwę pliku bez kropek (być może rzadką w przypadku plików, ale bardzo powszechną w przypadku folderów / katalogów) i na pierwszy rzut oka
*.*
nie pasuje do takich plików.Stare skrypty używające nadal
*.*
będą działać z powodu kodu zgodności - jeśli symbol wieloznaczny kończy się na.*
, część ta jest ignorowana przez system operacyjny. (Więc jeśli chcesz specjalnie dopasować pliki z rozszerzeniem, to chyba byś tego potrzebował*.?*
.)Ale na tym nie powinieneś polegać; jeśli piszesz skrypty dla nowoczesnych wersji systemu Windows, postępuj zgodnie z ich konwencjami, a nie konwencjami MS-DOS. (Należy pamiętać, że od Windows NT skrypty .bat nie są już interpretowane przez MS-DOS, ale przez
cmd.exe
natywny program Win32.)W Linuksie i różnych innych systemach Unixen nazwa i rozszerzenie nigdy nie były oddzielne i nie ma żadnej specjalnej magii, aby
*.*
zadziałać, więc*
jest to jedyny wybór, który ma sens.źródło
*
tylko do nazw plików bez rozszerzenia. „Bezpiecznym” sposobem na kompatybilność z oboma było użycie**
.*
( domyślnie ) nie pasuje do ukrytych nazw plików (zaczynając od a.
).To chyba warto wspomnieć, że unixy / posixy muszle jak Bourne Shell, bash, ksh, zsh, etc zrobić wieloznaczny ekspansji (od znaków glob podoba
*
,?
,[range]
,[!range]
i inne ekspansje jak szelki i rozszerzonych globs) sporządzić listę argumentów przed komendą jest wykonywany. Tak więc rozszerzenie jest wykonywane przez powłokę, a nie polecenie, dla którego mogą to być argumenty.tj. Powłoka jest odpowiedzialna za co
*
,*.*
rozwija się doNie dzieje się tak w przypadku CMD (i podobnie w przypadku narzędzi PowerShell ), ponieważ przekazuje dosłownie znaki globalne do wykonanego polecenia - więc rozszerzenie jest odpowiedzialnością polecenia / narzędzia, a nie powłoki. Ostatecznie więc pozostaje to , co
*.*
lub co*
pozostawia narzędziu, pozostawiając mu zgodność (lub nie) z konwencjami - dlatego narzędzia CMD lubiądir *.*
także dopasowywać (prawdopodobnie niepoprawnie, ale zachowując oczekiwania) pliki bez rozszerzeń.Uważam, że podsumowanie w ten sposób jest bezpieczne.
źródło
FindFirstFile
sam jest trybem użytkownika (zarówno kernel32.dll, jak i ntdll.dll są bibliotekami trybu użytkownika - to część podsystemu Win32, a nie jądro), ale tak naprawdę nie robi wiele.mmv "fred.*" "tom.#1"
. (#1
Zamiast tego używane są zamienniki*
, co ma tę zaletę, że umożliwia zmianę kolejności pól).mmv
nie jest instalowany domyślnie w większości systemów, ale często są dostępne inne narzędzia do zmiany nazw partii. Zobacz ten artykuł na ten temat i stackoverflow.com/questions/417916/how-to-do-a-mass-rename .