Windows上的Unix类型的“定位”?


17

使用Windows CLI(cmd),如何找到他知道部分名称的文件?例如,每一个Windows工作站都将javac安装在不同的位置,如何从Windows CLI(cmd)中找到它?

谷歌搜索我只提到使用Windows资源管理器(文件管理器)GUI或下载一些免费软件应用程序。Windows真的没有内置的定位命令吗?服务器版本有吗?我希望安装cygwin或其他任何东西,这些都是典型的不是我的机器。


3
Windows命令行内置的任何内容都无法真正找到。我会推荐locate32(locate32.net
John T

javac通常应该在同一地点...
Tamara Wijsman

1
@JohnT,该位置不再起作用-更新的locate32主页是locate32.cogit.net
TrojanName

1
尝试的GIT中-Bash.exe又名MINGW其包括locateupdatedb--per stackoverflow.com/questions/36841241/...
MarkHu

Answers:


22

您应该能够做以下事情dir

dir [filename] /s

将[filename]替换为您要查找的文件名,您应该可以使用通配符。/ s使其搜索子目录,因此如果需要,可以从C:的根目录开始,并检查整个驱动器。


如果要在整个驱动器中搜索通用文件名,则可能需要在/ p后面加上/ p,因为它一次只显示一页结果。
Windos

谢谢,这看起来很完美。我经常至少知道我需要在C:\ WINDOWS中搜索,这样可以缩短搜索时间。
dotancohen

1
我不认为该javac安装到C:\WINDOWS...
Tamara Wijsman

不适用于多个驱动器/分区。甚至在2011年,我不仅拥有C:Linux的位置并不关心文件系统。
尔根·艾哈德

1
@JürgenA.Erhard公平地说... Linux本身并不真正在乎“文件系统”,因为Windows会显示它们(据我有限的理解。)这些天,如果您要搜索多个驱动器,PowerShell是我的选择但是,因为您可以将所有卷组合在一起,并在所有卷上使用Get-ChildItem。
Windos

12

没有人谈论“ where”命令?它在当前环境的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

Windos有最直接的答案。但是,如果您喜欢命令行,那么您可能也想看看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
输入的时间太长了。
塔马拉·威斯曼

2
可以将Get-ChildItem缩写为gcils
digitxp 2011年

幸运的是,与中的cmdin 不同,PowerShell您可以像Linux中一样使用“ Tab”查看建议。因此实际键入的次数并不多。而且,就我而言,ls在PowerShell中无法正常工作。
WesternGun

3

我只是得到了适用于Windows定位程序。您只需要按照自述文件说明将.dll文件和.exe复制到system32。

备选方案包括将程序路径添加到环境变量PATH。

这个想法是,如果您正在寻找“类似”定位的东西,则可以在Windows上定位。:)


谢谢Cheeku,它看起来很方便。但是我确实提到我无法在系统上安装应用程序,因为它们通常不是我的系统。
dotancohen

2
是的,但是我仍然回答了,因为像我这样的其他人可以发现它有用,并且其他人也不会感到困惑,因为该帖子已经有了可接受的答案!
Cheeku

1
locate在我的Win7计算机上。它抱怨数据库安装了435天,而安装时间不超过3个月。并且updatedb不包括在内。
vinnief 2014年

我想,@ vinnief这是您安装的一个特殊问题。
2014年

1
@Cheeku-这是John T指向的同一应用程序。它不是OP所要求的CLI,但它很棒。
sancho.s恢复莫妮卡2014年

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/ (已经由John T,然后由Cheeku指向)。GUI,键入2。有一个便携式版本。出色的易用性和可配置性。与Unix非常相似locate(我曾经使用过并且非常喜欢它)。
    注意:我习惯了Unix Updatedb花费很长时间来更新数据库(当然,这取决于扫描树的大小),我发现它locate32 非常快。我不知道该如何改善。

  2. http://sourceforge.net/projects/winlocate/ CLI,输入2。

  3. dir [filename] / s由Windos解决。CLI,输入1。

  4. gci ...由OldWolf解决。CLI,输入1。

  5. http://gnuwin32.sourceforge.net/packages/findutils.htm CLI,输入2。

  6. 一切 GUI,键入?。


1
谢谢,这是一个很好的解释,也是一个不错的选择摘要。
dotancohen 2014年



2

我知道很久以前就已经回答了这个问题,但这是我的脚本,用于模拟在unix / linux中使用的locate函数

将该文件另存为locate.bat,然后放入System32中,或者从其存储目录中运行。采用一个类似“ cmd> locate javac.exe”的参数

找到/ c开关(作为第二个参数将计算实例数)并找到/?将显示帮助文本

@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

1

对于未来的太空Windows历史学家:我们很幸运,有了Everything Search。图片dmenu + find + mlocate汇总为带有cli选项的紧凑,非常小的Windows服务。除了这个东西实时更新其索引。Linux上没有什么比这更接近的了。这将是您会说“哎呀,我希望这个织补内核有点像Microsofty”的几次。


不错的工具。感谢您的发布。
Rudiger Wolf

1

简短的答案是Windows上没有完全等效的方法。解决方法是使用dir命令。这是一个目录列表命令,支持特殊字符,可以按照接受的答案中的说明使用。

在许多类似Unix的系统上,“ 定位”命令是基于索引的搜索。它与为文件系统建立索引的Updatedb命令协同工作。由于它是基于索引的搜索,因此通常比在Unix上基于文本的搜索命令(例如dirfind)要快得多,尤其是在搜索深层目录层次结构时。


where是完全等效的。
Alex78191

-3

我不知道要在Windows中执行此操作的任何CLI方法。请记住,Windows CLI已被普通用户放弃,因此它提供的工具通常不太成熟。最好的选择是find在Windows中使用gnu ,可以从GnuWin32获得。如果要开发脚本,则只需要find.exe在脚本中包含及其依赖项(不用担心,它不是很大)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.