13

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

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

11 ответов11

21

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

dir [filename] /s

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

7

Никто не говорит о "где" команда? это поиск исполняемого файла в 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.
4

У Виндоса самый простой ответ. Но если вы любите командную строку, вы можете посмотреть на 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..]
    }
3

Я просто получил программу поиска для Windows. Вам просто нужно следовать инструкциям read me и скопировать файлы .dll и .exe в system32.

Альтернатива включает добавление пути к программе в переменную окружения PATH.

Идея состоит в том, чтобы найти в Windows, если вы ищете что-то "как" найти. :)

2

Не нужно устанавливать вручную. Смотрите http://chocolatey.org

choco install winlocate

Перезапустите среду оболочки

Updatedb.bat -a
Locate.bat somefile
2

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

Вы хотите найти файл (указан в теле 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's 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, типа?

2

Я знаю, что на этот вопрос уже давным-давно ответили, однако это мой скрипт для имитации функции 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^] {term^/file to look for} ^| ^[^/t^] {dir^/subdirs to search} ^| ^[^/c^] {show counter}
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
2

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

.\Invoke-Locate.ps1 -install. 

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

затем

locate whatever

и все готово

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

0

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

0

Короткий ответ: точного эквивалента в Windows нет. Обходной путь должен использовать команду dir. Это команда списка каталогов, которая поддерживает специальные символы и может использоваться, как указано в принятом ответе.

Команда Locate во многих Unix-подобных системах является поиском по индексу. Он работает в тандеме с командой updatedb, которая индексирует файловые системы. Так как это поиск по индексу, он обычно намного быстрее, чем текстовые команды поиска, такие как dir и find в Unix, особенно при поиске в глубокой иерархии каталогов.

-3

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .