Еквівалент команди Unix для пошуку в Windows


34

Який еквівалент команди Unix find у Windows?

Я бачу, що в find.exeWindows більше схоже на grep. Мене особливо цікавить еквівалент

find . -name [filename]

2
Щось не так у моїй відповіді? Чи можу я її покращити? Вам ще потрібна допомога?
ЙоханнесМ

Вибачте, я втратив із поля зору цю нитку назад. Дякуємо за вашу відповідь та вибачення, що не прийняли її раніше.
ARV

Відповіді:


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, якщо ви не пишете сценарій.
Swonkie

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 під посиланням:

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", це рядок, а не об'єкт.

Ви також можете використовувати "Оператор", де його робота більше, і не набагато швидша:

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.