Unix-тип “знайти” в Windows?


17

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

У Google я бачу згадку лише про використання графічного інтерфейсу Windows Explorer (файлового менеджера) або завантаження якоїсь безкоштовної програми. Чи справді в Windows немає вбудованої команди locate? Чи є у серверних видань? Я не хочу встановлювати cygwin чи що-небудь інше, зазвичай це не мої машини.


3
Ніщо вбудоване в командний рядок Windows насправді не схоже на пошук. Я б рекомендував locate32 ( locate32.net )
Джон Т

javacзазвичай повинні бути там же ...
Tamara Wijsman

1
@JohnT це місце більше не працює - оновлений будинок locate32
TrojanName

1
Спробуйте Git-Bash.exe ака MinGW , яка включає в себе locateі updatedb--per stackoverflow.com/questions/36841241 / ...
MarkHu

Відповіді:


22

Ви повинні мати можливість робити те, що вам потрібно dir:

dir [filename] /s

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


Якщо ви шукаєте повний диск для загального імені файлу, ви також можете заплатити, щоб включити / p до цього, він відображає лише сторінку зі сторінками за раз.
Windos

Дякую, це виглядає ідеально. Я часто знаю принаймні, що мені потрібно шукати в C: \ WINDOWS, щоб це могло скоротити час, який займає пошук.
dotancohen

1
Я не думаю, що javacце встановлено для C:\WINDOWS...
Tamara Wijsman

Не працює з кількома дисками / розділами. І навіть у 2011 році у мене було більше, ніж просто C: розташування Linux не хвилює файлових систем.
Юрген А. Ерхард

1
@ JürgenA.Erhard, щоб бути справедливим ... Сам Linux насправді не хвилює "файлові системи", оскільки Windows представляє їх (на моє обмежене розуміння.) У ці дні, якщо ви хочете шукати більше, ніж один привід PowerShell, я б пішов хоча, як ви зможете згрупувати всі ваші томи і запустити Get-ChildItem на всі вони.
Віндос

12

Ніхто не говорить про команду "куди"? він шукає виконуваний файл у 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

У Віндоса найпростіша відповідь. Але якщо ви любите командний рядок, можливо, ви також захочете поглянути на папері. Для того ж типу пошуку, який ви використовували

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
Це здається занадто довго, щоб набрати.
Тамара Війсман

2
Get-ChildItem можна скоротити як gciабо ls.
digitxp

На щастя, на відміну від в cmd, PowerShellви можете використовувати "Tab", щоб побачити пропозиції, як в Linux. Тож насправді набирати не так вже й багато. І, в моєму випадку, lsв PowerShell не працює.
WesternGun

3

Я просто отримав програму пошуку для Windows . Вам просто потрібно дотримуватися інструкцій, прочитаних мною, і скопіювати .dll файли та .exe в system32.

Альтернативно включає додавання програмного шляху до змінної середовища PATH.

Ідея полягає у тому, щоб знайти локалізацію в Windows, якщо ви шукаєте щось подібне. :)


Дякую, Чіку, це схоже на зручну програму. Однак я згадав, що я не можу встановлювати програми в системі, оскільки вони, як правило, не є моєю системою.
dotancohen

2
Так, але я відповів у будь-якому випадку, оскільки інші люди, як я, можуть вважати це корисним, а інших не плутати, оскільки ця публікація вже прийняла відповідь!
Чеку

1
locateзнаходиться на моєму комп’ютері Win7. Він скаржиться на те, що база даних становить 435 днів, коли інталяція не більше 3 місяців. І updatedbне включається.
vinnief

@vinnief Я думаю, що це особлива проблема з вашою установкою.
Чіку

1
@Cheeku - Це одне і те ж додаток вказав на Джона Т . Це не CLI, як просив ОП, але це приголомшливо.
sancho.s Відновити Моніку

2

Питання дещо неоднозначне.

Ви хочете знайти файл (зазначений в тілі ОП), але ви також хочете команду / додаток "знайти тип" (вказано в заголовку). Є один тонкий розгляд з величезними наслідками. Ви можете знайти за допомогою двох різних методів:

  1. Пошук структури цільового дерева безпосередньо під час кожного пошуку (повільно).

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

Unix locateмає "тип 2", але відповідно до корпусу вашої ОП, вам було б добре з будь-яким із двох методів. Крім того, ви запитуєте конкретно про варіанти 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, тип ?.


1
Дякую, це хороше пояснення та хороший підсумок варіантів.
dotancohen

2

Я створив порт PowerShell для знаходження та оновленняb. Використовує SQLite як резервний і має автоматичну установку. Просто

.\Invoke-Locate.ps1 -install. 

Локали займають близько 300 мс / запит.

Потім

locate whatever

і ти налаштований.

введіть тут опис зображення

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



2

Я знаю, що на це відповіли давно, проте це мій сценарій для імітації функції пошуку, яка використовується в 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

EDIT: (Оновлений сценарій, більш організований і може вирішувати різноманітні ситуації, наприклад, для будь-якого пошукового терміну, а не лише для імені файлу)

@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

1

Для майбутніх космічних істориків Windows: нас благословило Все пошук . Знімок dmenu + find + mlocate згорнутий у тісний, непоганий варіант служби Windows з кліпами. За винятком цієї речі оновлення свого індексу в режимі реального часу . Нічого в Linux не наближається. Це буде один з небагатьох разів, коли ви скажете: "я хочу, щоб це чортове ядро ​​було трохи більше Microsofty"


Приємна утиліта. Дякуємо за публікацію
Вольф

1

Коротка відповідь полягає в тому, що в Windows немає точного еквівалента . Вирішення завдання полягає у використанні команди dir . Це команда списку каталогів, яка підтримує спеціальні символи, і може використовуватися як зазначено у прийнятій відповіді.

Команда Locate у багатьох системах, подібних Unix, - це пошук на основі індексу. Він працює в тандемі з командою Updateb, яка індексує файлові системи. Оскільки це пошук на основі індексу, він зазвичай набагато швидший, ніж текстові команди пошуку, такі як dir та пошук у Unix, особливо при пошуку глибокої ієрархії каталогів.


whereточний еквівалент.
Alex78191

-3

Мені невідомий жоден метод CLI для цього в Windows. Майте на увазі, що звичайні користувачі Windows CLI відмовилися, тому він пропонує, як правило, менш зрілий набір інструментів. Вашою найкращою ставкою може бути використання gnu findв Windows, яке ви можете отримати від GnuWin32 . Якщо ви розробляєте сценарій, вам слід просто включити find.exeйого та його залежності до сценарію (не хвилюйтесь, він не дуже великий).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.