Эквивалент Unix-команды поиска в Windows


34

Что эквивалентно команде поиска Unix в Windows?

Я вижу, что find.exeна Windows больше похоже на grep. Я особенно заинтересован в эквиваленте

find . -name [filename]

2
Что-то не так с моим ответом? Могу ли я улучшить это? Вам все еще нужна помощь?
JohannesM

Извините, я потерял из виду эту тему некоторое время назад. Спасибо за ваш ответ и извинения за то, что не приняли его раньше.
АРВ

Ответы:


21
dir <drive: [drive:]> /s | findstr /i <pattern>

- альтернатива -

dir /s <drive:>\<pattern>

пример

dir c: d: /s | findstr /i example.txt

- альтернатива -

dir /s c:\example.txt

dir c: /s example.txtтоже работает
DevSolar

@DevSolar вы можете перепроверить свою команду? Я проверил его на Windows 5.1 Build 2600 SP3, и ваша команда просто дает мне список файлов в каталоге c:
JohannesM

1
Э-э ... прости. Служит мне право печатать по памяти. dir /s C:\example.txtэто.
DevSolar

1
для наиболее похожих результатов я использую \bдля краткости (вывод только пути); find <folder> -name <pattern>-> dir /s /b <folder><pattern>. Например find /tmp -name *.txt-> dir \s \b C:\temp\*.txt. Однако dirвсегда возвращает список абсолютных путей, тогда как findвсегда дает пути с префиксом<folder>
Hashbrown

28

Find-ChildItemCmdlet в Windows Powershell является эквивалентом команды Unix / Linux находят

http://windows-powershell-scripts.blogspot.in/2009/08/unix-linux-find-equivalent-in.html

Некоторые из опций Find-ChildItem

  1. Find-ChildItem -Type f -Name ".*.exe"
  2. Find-ChildItem -Type f -Name "\.c$" -Exec "Get-Content {} | Measure-Object -Line -Character -Word"
  3. Find-ChildItem -Type f -Empty
  4. Find-ChildItem -Type f -Empty -OutObject
  5. Find-ChildItem -Type f -Empty -Delete
  6. Find-ChildItem -Type f -Size +9M -Delete
  7. Find-ChildItem -Type d
  8. Find-ChildItem -Type f -Size +50m -WTime +5 -MaxDepth 1 -Delete

Раскрытие информации: я разработчик Find-ChildItemcmdlet


2
Спасибо. Это определенно больше в виду того, что я буду искать, отвечая на этот вопрос.
Supercheetah

7
Find-ChildItemне является официальным командлетом и не входит в PowerShell; Вы должны загрузить этот командлет из OneDrive какого-то парня . Нет никакой разницы между этим и простой загрузкой bash, cygwin, unixutils или любой другой программы, которая просто позволяет вам запускать UNIX find.
Walen

19

Без дополнительных командлетов вы можете просто использовать Get-ChildItem:

Get-ChildItem -Filter *.zip -Recurse $pwd

1
В этом случае вы , вероятно , хотите использовать один из коротких псевдонимов dir, lsили gci, если вы не пишете сценарий.
Суонки

5

Если вы используете поиск Unix для поиска файлов в иерархии каталогов, то способ Powershell - использовать Get-ChildItem(псевдоним gci) командлет и фильтровать результаты с помощью Where-Object(псевдоним where) командлета.

Например, чтобы найти все файлы (начиная с C:\Users\и рекурсивно) со словом «существенный» в его имени, используйте следующее:

PS> gci -Path "C:\Users\"  -Recurse | where {$_.Name -like '*essential*'}

-likeОпция позволяет использовать подстановочные знаки для сопоставления с шаблоном.


2

Это не совсем GNU найти, но более близко соответствует философии командной строки Linux в PowerShell:

PS> dir -recurse -ea 0 | % FullName | sls <grep_string>

Пример:

PS> cd C:\
PS> dir -recurse -ea 0 | % FullName | sls "Program" | sls "Microsoft"
PS> dir -recurse -ea 0 | % FullName | sls "Program" | sls "Microsoft" | out-gridview

Примечание. Все, что возвращается после «|% FullName», является строкой, а не объектом.

Вы также можете использовать оператор Where, "?", Однако это больше работает и не намного быстрее:

PS> cd C:\
PS> dir -Recurse -ea 0 | ? FullName -like "*Program*" 
                       | ? FullName -like "*Microsoft*" 
                       | % FullName 
                       | out-gridview

Вот быстрый ярлык:

PS> function myfind {dir -recurse -ea 0 | % FullName | sls $args }

PS> cd C:\
PS> myfind "Programs" | sls "Microsoft"

#find all text files recursively from current directory
PS> myfind "\.txt$"

#find all files recursively from current directory
PS> myfind .

Найти -exec grep {} из UnixUtils не работает должным образом, кажется "нет такого файла или каталога". Это решение: PowerShell.exe -Command "dir -Recurse -ea 0 |? FullName-like '* .log' | sls error", изнутри пакетного сценария работает. Примечание: необходимо использовать одинарные кавычки внутри, двойные кавычки снаружи.
Кевинф
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.