Unix-тип "найти" в Windows?

27096
dotancohen

Используя Windows CLI (cmd), как найти файл, часть которого ему известна? Например, каждая рабочая станция Windows устанавливает javac в другое место, как его можно найти в Windows CLI (cmd)?

Поиск в Google Я вижу упоминание только об использовании графического интерфейса Windows Explorer (файлового менеджера) или загрузке некоторых бесплатных приложений. Разве в Windows нет встроенной команды locate? Есть ли у серверных версий? Я не хочу устанавливать Cygwin или что-то еще, как правило, это не мои машины.

13
Ничто из встроенного в командную строку Windows не похоже на поиск. Я бы порекомендовал locate32 (http://www.locate32.net/) John T 13 лет назад 3
`javac` обычно должен быть в том же месте ... Tom Wijsman 13 лет назад 0
@JohnT, это местоположение больше не работает - обновленный дом locate32 - https://locate32.cogit.net/ TrojanName 6 лет назад 0

10 ответов на вопрос

21
Windos

Вы должны быть в состоянии сделать то, что вам нужно сделать с dir:

dir [filename] /s 

Замените [имя файла] на имя файла, который вы ищете, вы должны быть в состоянии использовать подстановочные знаки. / s делает поиск в подкаталогах, поэтому, если вам нужно, вы можете запустить в корне C: и проверить весь диск.

Если вы ищете по всему диску общее имя файла, он может также заплатить, чтобы включить / p, чтобы он одновременно отображал только страницу результатов. Windos 13 лет назад 0
Спасибо, это выглядит отлично. Я часто знаю, по крайней мере, что мне нужно искать в C: \ WINDOWS, чтобы это могло сузить время поиска. dotancohen 13 лет назад 0
Я не думаю, что `javac` установлен в` C: \ WINDOWS` ... Tom Wijsman 13 лет назад 1
Не работает с несколькими дисками / разделами. И даже в 2011 году у меня было больше, чем просто местоположение C: Linux, не заботящееся о файловых системах. Jürgen A. Erhard 9 лет назад 0
@ JürgenA.Erhard, чтобы быть справедливым ... Самому Linux на самом деле нет дела до «файловых систем», поскольку Windows представляет их (насколько я понимаю.) В наши дни, если вы хотите искать по нескольким дискам, PowerShell будет моим выбором. к тому же, поскольку вы сможете сгруппировать все свои тома и пистолет Get-ChildItem на всех них. Windos 9 лет назад 1
Это отлично работает в XP. Я думаю, что версии после этого могут использовать команду `where`, хотя, возможно, только для исполняемых файлов Mark Adamson 8 лет назад 0
4
OldWolf

У Виндоса самый простой ответ. Но если вы любите командную строку, вы можете посмотреть на powershell. Чтобы выполнить тот же тип поиска, который вы используете

get-childitem [starting path eg c:\users\] -filter [wildcarded search or filename] -recurse 

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

get-childitem [starting path eg c:\users\] -filter [wildcarded search or filename] -recurse | foreach ($_){ [do something to $_.fullname, like maybe display my image file or relocate it etc..] } 
Это слишком долго, чтобы напечатать. Tom Wijsman 13 лет назад 2
Get-ChildItem может быть сокращено до `gci` или` ls`. digitxp 13 лет назад 2
К счастью, в отличие от `cmd`, в` PowerShell` вы можете использовать «Tab» для просмотра предложений, как в Linux. Так что печатать на самом деле не так уж и много. И, в моем случае, `ls` в PowerShell не работает. WesternGun 7 лет назад 0
4
Kuddusi Çiftçibaşı

Никто не говорит о "где" команда? это поиск исполняемого файла в PATH текущей среды.

where <executable>  c:\ where The syntax of this command is:  WHERE [/R dir] [/Q] [/F] [/T] pattern...  Description: Displays the location of files that match the search pattern. By default, the search is done along the current directory and in the paths specified by the PATH environment variable. 
3
Cheeku

I simply got a locate program for Windows. You just need to follow the read me instructions and copy the .dll files and .exe to system32.

Alternative includes adding the program path to the environment variable PATH.

The idea is to get locate on Windows if you're looking for something "like" locate. :)

Спасибо Cheeku, это выглядит как удобное приложение. Однако я упомянул, что не могу устанавливать приложения в системе, поскольку они, как правило, не являются моими системами. dotancohen 10 лет назад 0
Да, но я все равно ответил, потому что другие люди, как я, могут найти это полезным, и другие не будут смущены, так как этот пост уже имеет принятый ответ! Cheeku 10 лет назад 0
`locate` находится на моем компьютере с Win7. Он жалуется на то, что базе данных 435 дней, а возрастом не более 3 месяцев. И `updatedb` не входит. vinnief 10 лет назад 0
@vinnief Это особая проблема с вашей установкой, я полагаю. Cheeku 10 лет назад 0
Полагаю, нет времени проверять. Я был удивлен, чтобы найти место на всех. vinnief 10 лет назад 0
@dotancohen - есть портативная версия. У меня также есть ограничения в моей системе, и я мог использовать портативный компьютер без проблем. Пока что я нашел это выдающимся. Вполне настраиваемый. sancho.s 10 лет назад 0
@Cheeku - это то же самое приложение [на которое указал Джон Т] (http://superuser.com/questions/327109/unix-type-locate-on-windows#comment353905_327109). Это не CLI, как спросил ОП, но это потрясающе. sancho.s 10 лет назад 1
2
sancho.s

Вопрос несколько двусмысленный.

Вы хотите найти файл (указан в теле OP), но вам также нужна команда / приложение «locate-type» (указано в заголовке). Есть одно тонкое соображение с огромными последствиями. Вы можете найти с помощью двух разных методов:

  1. Поиск целевой древовидной структуры непосредственно в каждом поиске (медленный).

  2. Сначала создается база данных целевой древовидной структуры (может занимать много времени), а затем выполняется поиск по базе данных (очень быстро). База данных должна периодически обновляться, чтобы получить хорошие результаты в поисках. См. Http://en.wikipedia.org/wiki/Locate_%28Unix%29 .

Unix locateимеет «тип 2», но в соответствии с телом вашего OP, вы будете в порядке с любым из двух методов. Более того, вы спрашиваете конкретно о параметрах CLI.

Ниже я перечисляю некоторые параметры и указываю, являются ли они CLI / GUI, типа 1/2, и я добавляю некоторые комментарии.

  1. http://locate32.cogit.net/ (на него уже указал Джон Т, а затем Чику ). GUI, тип 2. Есть портативная версия. Выдающаяся простота использования и настраиваемость. Очень похоже на Unix locate(который я использовал и очень понравился).
    Примечание : я привык к тому, что Unix Updatedbтратит достаточно много времени на обновление базы данных (конечно, это зависит от размера отсканированного дерева), я нахожу это locate32 чрезвычайно быстро. Я не знаю, как это можно улучшить.

  2. http://sourceforge.net/projects/winlocate/ CLI, тип 2.

  3. dir [имя файла] / s, решение от Windos . CLI, тип 1.

  4. gci ..., решение от OldWolf . CLI, тип 1.

  5. http://gnuwin32.sourceforge.net/packages/findutils.htm CLI, тип 2.

  6. Все GUI, типа?

Спасибо, это хорошее объяснение и хорошее резюме вариантов. dotancohen 10 лет назад 1
2
Chrissy LeMaire

Я создал порт PowerShell для locate и updatedb. Использует SQLite в качестве бэкэнда и имеет автоинсталлятор. Просто

.\Invoke-Locate.ps1 -install. 

поиск занимает около 300 мс / запрос.

затем

locate whatever 

и все готово

enter image description here

https://gallery.technet.microsoft.com/scriptcenter/Invoke-Locate-PowerShell-0aa2673a

2
Jonathan

No need to install by hand. See http://chocolatey.org

choco install winlocate 

Restart shell environment

Updatedb.bat -a Locate.bat somefile 
winlocate больше не существует на Chocolatey. Lennart 8 лет назад 0
2
Tzlet

Я знаю, что на этот вопрос уже давным-давно ответили, однако это мой скрипт для имитации функции locate, используемой в unix / linux

Сохраните его как locate.bat и поместите в System32 ИЛИ запустите из каталога, в котором он хранится. Принимает один параметр, например «cmd> locate javac.exe»

Переключатель locate / c (в качестве второго параметра будет подсчитывать количество экземпляров) и locate /? отобразит текст справки

@echo off  if [%1]==[] goto :usage if [%1] == [/?] ( :usage echo Usage:  echo locate "filename" { optional } /c { shows counter } echo note: results are exported to C:\temp\result.txt goto :EOF ) else ( setlocal EnableDelayedExpansion dir /a /b /s C:\ | findstr /I "%1" > C:\temp\result.txt  type C:\temp\result.txt | more /S set counter=0 if [%2] == [/c] ( for /F %%i in ('type C:\temp\result.txt') do ( set /a counter=!counter!+1 ) echo Total Matches: !counter! )  ) endlocal > nul  goto :EOF 

РЕДАКТИРОВАТЬ: (Обновленный сценарий, более организованный и может обрабатывать более широкий спектр ситуаций, например, допускает любой поисковый запрос, а не просто имя файла)

@echo off ::initialize local varaibles to default values setlocal  set file= set directory= set toppath=top  ::some switch validation ( from command line ) if [%1]==[] goto :Usage if [%1]==[/?] goto :Usage if [%1]==[/help] goto :Usage  ::handle switches with if structures if [%2]==[/c] ( set count=yes ) ELSE ( if [%2]==[/t] ( if [%3]==[] (goto :Usage) else (set toppath=%3))  if [%4]==[/c] ( set count=yes ) ELSE ( set count= ) ) set file=%1  ::Directory Validation ( Goto jumps possible, along with raptors )  if [%toppath%] == [] (  IF NOT EXIST %toppath% goto :FolderInvalid  ) else ( if [%toppath%] neq [top] set directory=%toppath% ) set toppath= setlocal EnableDelayedExpansion  ::Run Bulk of the Script dir /a /b /s %directory% | findstr /I "%file%" > C:\temp\result.txt  type C:\temp\result.txt | more /S set counter=0 if [%count%]==[yes] ( for /F %%i in ('type C:\temp\result.txt') do ( set /a counter=!counter!+1 ) echo Total Matches: !counter! )   goto :End  :Usage echo locate ^[file^] ^| ^[^/t^] ^| ^[^/c^]  echo. echo notes to user: 1. Results are exported to C:\temp\result.txt echo 2. Default search dir is the current unless specified by ^/t switch echo 3. For best results write switches in order given ! ( or beware of raptors ) goto :End  :FolderInvalid echo Folder Invalid  :End endlocal > nul 
0
Steve Goranson

Для будущих космических историков Windows: мы были благословлены поиском всего . Изображение dmenu + find + mlocate, свернутое в довольно симпатичную маленькую службу Windows с параметрами cli. Кроме того, эта вещь обновляет свой индекс в режиме реального времени . Ничто в Linux не подходит близко. Это будет один из тех немногих случаев, когда вы скажете: «Ну и дела, я бы хотел, чтобы это чертово ядро ​​было немного больше Microsofty»

-3
jcrawfordor

Я не знаю ни одного метода CLI, чтобы сделать это в Windows. Имейте в виду, что интерфейс командной строки Windows был заброшен обычными пользователями, поэтому он предлагает, как правило, менее зрелый набор инструментов. Лучшим вариантом может быть использование gnu findв Windows, которую вы можете получить от GnuWin32 . Если вы разрабатываете сценарий, вам просто нужно включить find.exeи его зависимости со сценарием (не волнуйтесь, он не очень большой).