Каталог поиска файлов по шаблону - Windows - PullRequest
1 голос
/ 03 августа 2020

Я пытался заставить эту работу работать дольше, чем мне хотелось бы признать, но по какой-то причине я не могу этого понять. Обычно я работаю с Linux / Unix.

Я просто хочу найти в каталоге все экземпляры, где имя файла соответствует строке.

Некоторые вещи, которые я пробовал:

dir /s "/path/to/Test*"

dir /s/b "C:/path/to/Test*"

Кроме того, я надеюсь вернуть что-то, что можно легко импортировать в массив. Что-то без лишней информации. Все, что мне нужно, это путь или, по крайней мере, имя файла для каждого сопоставленного файла.

Изменить: мне не нужна такая информация (если возможно)

 Volume in drive C is OS
 Volume Serial Number is...

Изменить: Test* предназначен для обозначения всех имен файлов, начинающихся с Test. Итак, TestA, TestB, & TestC должны совпадать.

Ответы [ 4 ]

1 голос
/ 03 августа 2020

Извините, я не заметил, что вы привыкли работать с UNIX / Linux, поэтому здесь у меня есть подход, который вы предпочтете:

forfiles /P C:\ /S /M test* /C "cmd /c echo @path"

Это делает следующее:

/P C:\              Start looking in C:\
/S                  Search through subdirectories
/M test*            Filename looks like "test*"
/C <cmd>            When found, launch <cmd>
"cmd /c echo @path" Echo (write to output) the complete path of the found file or directory

Это даст вам список файлов и каталогов, записанных в виде полных путей, что-то вроде:

"C:\Octave\Octave-5.2.0\mingw64\bin\test-libiberty.exe"
"C:\Octave\Octave-5.2.0\mingw64\bin\test-lua.exe"
"C:\Octave\Octave-5.2.0\mingw64\bin\test-tinyxml.exe"
"C:\Octave\Octave-5.2.0\mingw64\include\llvm\Testing"         <-- this is a directory
"C:\Octave\Octave-5.2.0\mingw64\include\wx-3.0\wx\testing.h"
...

Что очень похоже на типичные результаты UNIX / Linux, вы ' re used to.

Более подробную информацию о forfiles можно найти, запустив forfiles /?.

1 голос
/ 03 августа 2020

Те же команды работают с Linux, Ma c и Windows. http://github.com/PowerShell/PowerShell/

PS C:\src> (Get-ChildItem -Recurse -File -Path 'C:/src/d2' -Filter 'test*').FullName
C:\src\d2\test.bat
C:\src\d2\test.ps1
C:\src\d2\test.sql
C:\src\d2\test.txt
C:\src\d2\copyt\test.txt

Используя псевдонимы команд, он может быть короче для интерактивного использования. Но псевдонимы не являются хорошей практикой для сценариев.

PS C:\src> (ls -r -file 'C:/src/d2/test*').FullName
C:\src\d2\test.bat
C:\src\d2\test.ps1
C:\src\d2\test.sql
C:\src\d2\test.txt
C:\src\d2\copyt\test.txt

Если вам нужен массив, он будет создан.

PS C:\src> $files = (ls -r -file 'C:/src/d2/test*').FullName
PS C:\src> $files.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

Замените разделители каталогов на -replace.

(Get-ChildItem -Recurse -Path 'C:/src/d2' -Filter 'test.*').FullName -replace '\\','/'

Объедините их в одну строку с помощью -join. В этом соединении используется ЗАПЯТАЯ. Обратите внимание, что если соединение использует COLON в стиле * NIX, оно не будет работать на Windows.

PS C:\src> (Get-ChildItem -Recurse -Path 'C:/src/d2' -Filter 'test.*').FullName -replace '\\','/' -join (',')
C:/src/d2/test.bat,C:/src/d2/test.ps1,C:/src/d2/test.sql,C:/src/d2/test.txt,C:/src/d2/copyt/test.txt

Если вам нужен разделитель в стиле PATH, используйте:

(Get-ChildItem -Recurse -Path 'C:/src/d2' -Filter 'test.*').FullName -replace '\\','/' -join ([IO.Path]::PathSeparator)
0 голосов
/ 03 августа 2020

Основываясь на вашем заявлении: «Я надеюсь вернуть что-то, что можно легко импортировать в массив», я предполагаю, что вы, вероятно, ищете что-то более похожее на это:

@Echo Off
Rem Ensure that extensions are enabled (required for SET and FOR commands)
SetLocal EnableExtensions
Rem Ensures that there are no existing variables in the environment with names beginning with file[
For /F "Delims==" %%G In ('" Set file[ 2> NUL "') Do Set "%%G="
Rem Gets every file matching the glob test* in the tree rooted at "C:\path\to"
Rem and defines an incremented variable name for each, beginning at %file[1]%
For /F "Tokens=1,* Delims=]" %%G In (
    '" Dir /B /S /A-D "C:\path\to\test*" 2> NUL | "%__AppDir__%find.exe" /N /V "" "'
) Do Set "file%%G]=%%H"
Rem An example line to show you all of the variables you have now defined
Set file[ 2> NUL
Rem Pause the script to ensure that you have been able to read any output
Pause
Rem An example line to show you all the first defined variable value
Echo=%file[1]%
Rem Pause the script to ensure that you have been able to read any output
Pause

. ..и вот он без Rem arks:

@Echo Off
SetLocal EnableExtensions
For /F "Delims==" %%G In ('" Set file[ 2> NUL "') Do Set "%%G="
For /F "Tokens=1,* Delims=]" %%G In (
    '" Dir /B /S /A-D "C:\path\to\test*" 2> NUL | "%__AppDir__%find.exe" /N /V "" "'
) Do Set "file%%G]=%%H"
Set file[ 2> NUL
Pause
Echo=%file[1]%
Pause

Не забудьте изменить C:\path\to\test*, как требуется для вашего c местоположения и глобуса.

0 голосов
/ 03 августа 2020

Я только что искал все файлы под названием "test. *" На моем C: - диске, используя эту простую команду:

dir /S C:\test*

Хотя я просто упоминаю каталог C:\, /S проверяет, что все подпапки тоже используются. Кроме того, как видите, здесь нет двойных кавычек.

Решает ли это вашу проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...