Когда я запускаю реж *.*
это приводит к непредвиденным результатам. Даже файлы и папки без каких-либо точка в их имена перечислены. Например
C:\>dir *.*
Volume in drive C is System
Volume Serial Number is AC0A-29DA
Directory of C:\
14-03-2017 05:17 PM 8,192 ntuser.dat
03-01-2017 07:10 PM <DIR> Perl520
28-03-2017 10:13 AM <DIR> Program Files
28-03-2017 10:13 AM <DIR> Program Files (x86)
04-01-2017 03:25 PM <JUNCTION> Python27 [C:\Program Files\Anaconda]
06-02-2017 10:16 PM <DIR> SAP
28-03-2017 04:10 PM 152 useragent.log
03-01-2017 03:04 PM <DIR> Users
16-03-2017 04:24 PM <DIR> VM
22-03-2017 11:13 AM <DIR> Windows
2 File(s) 8,344 bytes
8 Dir(s) 270,172,966,912 bytes free
Почему? Есть ли способ, чтобы список только файлов с точкой?
Я пишу этот ответ, потому что ОП подчеркнул, что:
что я'заинтересована м why
*.*
соответствует все файлы,, как указано в вопросе
Команда реж
происходит от времени, когда:
Следовательно, согласно этому стандарту, *.*
означало whatever имя и любой extension. Это не означает а строку, содержащую а ".", который может или не может иметь знаков до или после того, как в ".&от".
Политика Microsoft является сохранение обратной совместимости. Следовательно, это толкование *.*
при этом сохраняется.
Но в Windows PowerShell, а *.*
означает строку а, содержащих а ".", который может или не может иметь знаков до или после того, как в ".&от".
Можно найти ответ, чтобы "Почему это?" в маски статьи:
подстановочный знак " * " будет соответствовать любой последовательности символов (0 или более, включая символы нуля)
и GT;? подстановочный знак будет соответствовать одному символу (или null в конце имени)
...
сопоставление правил
-
*
, как правило, соответствует 0 или больше любых символов, за одним исключением (см. Следующее правило). Самый нежадный шаблон это бесплатно, чтобы соответствовать как много или как несколько символов, которые необходимы для остальной части маска для В матче.
*.
В конце маска соответствует 0 или больше любых символов, за исключением {точка}. В действительности, правило применяется при любом количестве {точка} и {пробел} символов между и терминал {точка}. Регулярное выражение для этого термина в `"[][. ]*[.]$"`в
?
Соответствует 0 или одного персонажа, за исключением {точка}. Единственный раз, когда он соответствует 0 символов, когда это соответствует концу именем, или позиции до {точка}. Вопросительный знак также может быть использован более чем один раз, чтобы соответствовать более чем один символ.
Импликация. В прошлом {точка} в имени файла/папки разделяет имя базы и расширения. Так
реж *.
отображает все товары расширение, иреж *.*
дисплеи все товары расширение ноль или более символов.Строго говоря, реж *.
отображает все товары срок (.
) в имя. (Кстати, [файлов именование пространств имен][2] в статье MSDN говорит explicitly, что "допускается указывать в качестве первого символа именито".)
Я не'т так думаю. Однако существует обходной путь, с подходящее регулярное выражение.
В PowerShell (полное разрешение объем если использовать в консоли PowerShell):
:: PowerShell - no extension, full syntax
PowerShell -c "Get-ChildItem | Where-Object {$_.Name -match '^.[^\.]*$'}"
:: PowerShell - extension, alias syntax
PowerShell -c "dir | ? {$_.Name -match '^..*\...*$'}"
УМК (идея, только, может потребовать некоторой доработки):
:: CMD/batch - no extension
for /F "delims=" %%G in ('dir /OGN /B ^| findstr "^.[^\.]*$"') do @echo %%~tG %%~aG %%~zG %%~nxG
:: CMD/batch - extension
for /F "delims=" %%G in ('dir /OGN /B ^| findstr "^..*\...*$"') do @echo %%~tG %%~aG %%~zG %%~nxG
Интуитивно догадываюсь, что имя
связывается имени
и расширение
не держит. Следующий скрипт доказывает это, используя cmd
и PowerShell с
базовые функции, а странно ^..*\...*$
регулярное выражение является производным от его's результаты.
@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
set "_workingDirectory=%~1"
if "%_workingDirectory%"=="%tmp%\tests_SU_1193102" (
>NUL 2>&1 (
mkdir "%_workingDirectory%"
pushd "%_workingDirectory%"
rem make directories
mkdir .Fldr-Ext
mkdir aFldr-Ext
mkdir .Fldr.Ext
mkdir aFldr.Ext
rem create files
copy NUL .File-Ext
copy NUL aFile-Ext
copy NUL .File.Ext
copy NUL aFile.Ext
popd
)
) else if "%_workingDirectory%"=="" set "_workingDirectory=%CD%"
pushd "%_workingDirectory%"
set "_first=ItemName Attributes BaseName Extension"
echo ON
:: dir /OGN | findstr "Ext$"
for /F "delims=" %%G in ('dir /OGN /B') do @((if defined _first (echo %_first%&echo(&set "_first="))&echo %%~nxG %%~aG %%~nG %%~xG)
:: Get-ChildItem | Select-Object -Property Mode, BaseName, Extension, Name
PowerShell -c "dir | select -pr Name, Mode, BaseName, Extension | sort -pr @{Expression='Mode';Descending=$true}, @{Expression='Name';Descending=$false}"
Вывод:
==> D:\bat\BaseName_vs_Extension.bat "%tmp%\tests_SU_1193102"
==> for /F "delims=" %G in ('dir /OGN /B') do @((if defined _first (echo ItemName Attributes BaseName Extension & echo( & set "_first=" ) ) & echo %~nxG %~aG %~nG %~xG )
ItemName Attributes BaseName Extension
.Fldr.Ext d---------- .Fldr .Ext
.Fldr-Ext d---------- .Fldr-Ext
aFldr.Ext d---------- aFldr .Ext
aFldr-Ext d---------- aFldr-Ext
.File.Ext --a-------- .File .Ext
.File-Ext --a-------- .File-Ext
aFile.Ext --a-------- aFile .Ext
aFile-Ext --a-------- aFile-Ext
==> PowerShell -c "dir | select -pr Name, Mode, BaseName, Extension | sort -pr @{Expression='Mode';Descending=$true}, @{Expression='Name';Descending=$false}"
Name Mode BaseName Extension
---- ---- -------- ---------
.Fldr.Ext d----- .Fldr.Ext .Ext
.Fldr-Ext d----- .Fldr-Ext .Fldr-Ext
aFldr.Ext d----- aFldr.Ext .Ext
aFldr-Ext d----- aFldr-Ext
.File.Ext -a---- .File .Ext
.File-Ext -a---- .File-Ext
aFile.Ext -a---- aFile .Ext
aFile-Ext -a---- aFile-Ext
Сравните определение файлов свойств, различных файлов и папок:
PS D:\PShell> Get-ChildItem | Get-Member -Name BaseName | Format-List -property TypeName, Definition
TypeName : System.IO.DirectoryInfo
Definition : System.Object BaseName {get=$this.Name;}
TypeName : System.IO.FileInfo
Definition : System.Object BaseName {get=if ($this.Extension.Length -gt
0){$this.Name.Remove($this.Name.Length -
$this.Extension.Length)}else{$this.Name};}
Мой оригинал ответа был основан на непростительное недоразумение:
<удар>
Читать реж /?, используйте
реж /Д:-Д:
/а отображает файлы с указанными атрибутами. атрибуты Д каталогах R файлы только для чтения H скрытые файлы файлы готовые к архивированию s системные файлы я не проиндексированных файлов л точки повторной обработки - приставка, означающая не
Другой подход: применить она
выражение как реж *.* я | команда findstr /V и;<.*>"
в
</удара>
[2]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(В=и 85).аспн
Есть ли какой-нибудь способ, чтобы отобразить только файлы с точкой?
Вы можете сопоставить имена с точкой с помощью недокументированных подстановки в <
, которое соответствует любой последовательности из 0 или более символов в имени файла или последовательность из 0 или более символов в расширении:
dir "<.<"
Помните, что в <
также метасимвол, так что вам нужно, чтобы цитировать или избежать его при использовании его в шаблон из командной оболочки.
Интерпретатор командной строки увидим и"." и как "Все имена" с "все расширения и". Пустой расширения еще расширение, так будет соответствовать и вернулся со списком. Как уже объяснил, это похмелье от предыдущих версий Windows и MS-DOS для.
Если вы'вновь счастливым, чтобы посмотреть с помощью PowerShell, поиск этих файлов намного легче. Обратите внимание, что в PowerShell, что "реж" это псевдоним "и получить-ChildItem-то" командлета.
Чтобы найти все файлы (не папки/папки) с расширением (например, "в файл myfile.тхт", но не "по FileWithNoExt-то"):
dir -af | Where {$_.Name -match "\."}
в " АФ" и выключатель обозначение на "-файл", который ограничивает возвращают объекты только к файлам. и" ад" и только вам каталоги. В "\." и означает "в буквальном точечный характер и". Без слеш, точка будет соответствовать любому символу, как в стандартных регулярных выражений.
Чтобы получить все файлы, где есть точки в имени без расширения, а также расширение (например, на "myDocument_v1.1.док", а не "в файл myfile.тхт", у):
dir -af | Where {$_.BaseName -match "\."}
Однако, обратите внимание, что это позволит исключить файл с именем, такие как ".архив" с предшествующей точки. Это потому, что он'ы рассматриваться как не имеющий имени и расширения от"архиве " и;. Если вы хотите включить эти:
dir -af | Where {$_.BaseName -match "\.|^$"}
Вот, картина матча пишет "в обычную точку, или(|) BeginningOfString(^) с последующим EndOfString я($) (т. е. пустая строка)&;. Поскольку файл может'т иметь пустую базовое имя и расширение, это найти файлы, начинающиеся с точки.
Если вы вводите вышеуказанную команду, то вот: