Unix loại kiểu xác định vị trí trên Windows?


17

Sử dụng Windows CLI (cmd), làm thế nào để xác định vị trí một tệp mà anh ta biết một phần của tên? Chẳng hạn, mỗi máy trạm Windows đơn lẻ cài đặt javac ở một vị trí khác nhau, làm thế nào để tìm thấy nó từ Windows CLI (cmd)?

Googling tôi thấy chỉ đề cập đến việc sử dụng GUI Windows Explorer (trình quản lý tệp) hoặc tải xuống một số ứng dụng phần mềm miễn phí. Windows thực sự không có lệnh định vị được tích hợp? Các phiên bản máy chủ có nó? Tôi không muốn cài đặt cygwin hoặc bất cứ thứ gì khác, đây thường không phải là máy của tôi.


3
Không có gì tích hợp trong dòng lệnh Windows thực sự giống với định vị. Tôi muốn giới thiệu định vị32 (định vị 32.net )
John T

javacthường nên ở cùng một nơi ...
Tamara Wijsman

1
@ John vị trí đó không còn hoạt động - nhà định vị được cập nhật là định vị32.cogit.net
TrojanName

1
Hãy dùng thử Git-Bash.exe hay còn gọi là MINGW, bao gồm locateupdatedb--per stackoverflow.com/questions/36841241/iêu
MarkHu

Câu trả lời:


23

Bạn sẽ có thể làm những gì bạn cần làm với dir:

dir [filename] /s

Thay thế [tên tệp] bằng tên tệp bạn đang tìm, bạn sẽ có thể sử dụng ký tự đại diện. / s làm cho nó tìm kiếm các thư mục con, vì vậy nếu bạn cần, bạn có thể bắt đầu trong thư mục gốc của C: và để nó kiểm tra toàn bộ ổ đĩa.


Nếu bạn đang tìm kiếm toàn bộ ổ đĩa cho một tên tệp chung, nó cũng có thể trả tiền để bao gồm / p để nó chỉ hiển thị cho bạn một trang kết quả tại một thời điểm.
Windos

Cảm ơn bạn, điều này có vẻ hoàn hảo. Tôi thường biết ít nhất là tôi cần tìm kiếm trong C: \ WINDOWS để việc này có thể thu hẹp thời gian tìm kiếm.
dotancohen

1
Tôi không nghĩ rằng nó đã javacđược cài đặt để C:\WINDOWS...
Tamara Wijsman

Không hoạt động với nhiều ổ đĩa / phân vùng. Và thậm chí vào năm 2011, tôi không chỉ tìm thấy C: Linux mà không quan tâm đến các hệ thống tập tin.
Jürgen A. Erhard

1
@ JürgenA.Erhard công bằng ... Bản thân Linux không thực sự quan tâm đến 'hệ thống tệp' vì Windows trình bày chúng (theo hiểu biết hạn chế của tôi.) Những ngày này nếu bạn muốn tìm kiếm trên nhiều ổ đĩa, PowerShell sẽ là của tôi mặc dù vậy, vì bạn có thể nhóm lại tất cả các tập của mình và dùng súng Get-ChildItem trên tất cả chúng.
Windos

11

Không ai nói về lệnh "ở đâu"? nó tìm kiếm tập tin thực thi trong PATH của môi trường hiện tại.

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 có câu trả lời đơn giản nhất. Nhưng nếu bạn thích dòng lệnh, bạn cũng có thể muốn xem xét powershell. Để thực hiện cùng loại tìm kiếm bạn sử dụng

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

Điều này có lợi ích tốt đẹp là có thể được bơm vào một tuyên bố foreach tiện dụng và chạy một quá trình chống lại kết quả tìm kiếm.

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
Điều này cảm thấy quá dài để loại ra.
Tamara Wijsman

2
Get-ChildItem có thể được viết tắt là gcihoặc ls.
chữ sốxp

May mắn thay, không giống như trong cmd, PowerShellbạn có thể sử dụng "Tab" để xem các đề xuất, như trong Linux. Vì vậy, nó không quá nhiều để gõ thực sự. Và, trong trường hợp của tôi, lstrong PowerShell không hoạt động.
WesternGun

3

Tôi chỉ đơn giản là có một chương trình định vị cho Windows . Bạn chỉ cần làm theo các hướng dẫn đọc tôi và sao chép các tập tin và .exe vào system32.

Thay thế bao gồm thêm đường dẫn chương trình vào biến môi trường PATH.

Ý tưởng là để xác định vị trí trên Windows nếu bạn đang tìm kiếm một cái gì đó "như" định vị. :)


Cảm ơn bạn Cheeku, đó trông giống như một ứng dụng tiện dụng. Tuy nhiên tôi đã đề cập rằng tôi không thể cài đặt các ứng dụng trên hệ thống vì chúng thường không phải là hệ thống của tôi.
dotancohen

2
Có, nhưng tôi đã trả lời dù sao đi nữa vì những người khác như tôi có thể thấy nó hữu ích và những người khác sẽ không bị nhầm lẫn vì bài đăng này đã có câu trả lời được chấp nhận!
Cheeku

1
locatelà trên máy tính Win7 của tôi. Nó phàn nàn về cơ sở dữ liệu đã được 435 ngày, khi thời gian xâm nhập không quá 3 tháng. Và updatedbkhông được bao gồm.
vinnief

@vinnief Đó là một vấn đề cụ thể với cài đặt của bạn, tôi đoán vậy.
Cheeku

1
@Cheeku - Đây là ứng dụng tương tự chỉ vào John T . Nó không phải là CLI như OP yêu cầu, nhưng nó thật tuyệt vời.
sancho.s Tái lập lại

2

Câu hỏi có phần mơ hồ.

Bạn muốn xác định vị trí một tệp (được nêu trong phần thân của OP), nhưng bạn cũng muốn một lệnh / ứng dụng "định vị loại" (được nêu trong tiêu đề). Có một sự xem xét tinh tế với ý nghĩa rất lớn. Bạn có thể định vị bằng hai phương pháp khác nhau:

  1. Tìm kiếm cấu trúc cây mục tiêu trực tiếp trong mỗi tìm kiếm (chậm).

  2. Đầu tiên tạo cơ sở dữ liệu của cấu trúc cây mục tiêu (có thể tốn thời gian), sau đó định vị bằng cách tìm kiếm cơ sở dữ liệu (rất nhanh). Cơ sở dữ liệu phải được cập nhật định kỳ để có kết quả tốt trong các tìm kiếm. Xem http://en.wikipedia.org/wiki/Locate_%28Unix%29 .

Unix locatethuộc loại "2", nhưng theo cơ thể của OP, bạn sẽ ổn với bất kỳ phương pháp nào trong hai phương pháp. Hơn nữa, bạn hỏi cụ thể về các tùy chọn CLI.

Tôi liệt kê bên dưới một số tùy chọn và tôi chỉ định xem chúng có phải là CLI / GUI không, gõ 1/2 và tôi thêm một số nhận xét.

  1. http://locate32.cogit.net/ (đã được chỉ ra bởi John T và sau đó bởi Cheeku ). GUI, loại 2. Có phiên bản di động. Dễ dàng vượt trội của việc sử dụng, và cấu hình. Rất giống với Unix locate(mà tôi đã sử dụng và thích rất nhiều).
    Lưu ý : Đã quen với Unix Updatedbmất khá nhiều thời gian để cập nhật cơ sở dữ liệu (tất nhiên, nó phụ thuộc vào kích thước của cây được quét), tôi thấy locate32 cực kỳ nhanh. Tôi không biết làm thế nào nó có thể được cải thiện rất nhiều.

  2. http://sourceforge.net/projects/winlocate/ CLI, loại 2.

  3. dir [tên tệp] / s , giải pháp của Windos . CLI, loại 1.

  4. gci ... , giải pháp của OldWolf . CLI, loại 1.

  5. http://gnuwin32.sourceforge.net/packages/findutils.htm CLI, loại 2.

  6. Tất cả mọi thứ GUI, loại ?.


1
Cảm ơn bạn, đây là một lời giải thích tốt và một bản tóm tắt tốt đẹp của các tùy chọn.
dotancohen


2

Không cần phải cài đặt bằng tay. Xem http://chatioatey.org

choco install winlocate

Khởi động lại môi trường vỏ

Updatedb.bat -a
Locate.bat somefile

1
winlocate không phải là (nữa) trên Chocolatey.
Lennart

2

Tôi biết điều này đã được trả lời từ lâu, tuy nhiên đây là tập lệnh của tôi để mô phỏng chức năng định vị được sử dụng trong unix / linux

Lưu cái này dưới dạng location.bat và đặt vào System32 HOẶC chạy từ thư mục được lưu trong. Lấy một tham số như "cmd> xác định vị trí javac.exe"

Công tắc định vị / c (như một tham số thứ 2 sẽ đếm số lượng phiên bản) và xác định vị trí /? sẽ hiển thị văn bản trợ giúp

@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: (Tập lệnh được cập nhật, có tổ chức hơn và có thể xử lý nhiều tình huống khác nhau, chẳng hạn như cho phép mọi cụm từ tìm kiếm không chỉ là tên tệp)

@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

Đối với các nhà sử học Windows trong không gian trong tương lai: chúng tôi đã được ban phước với Tìm kiếm mọi thứ . Hình ảnh dmenu + find + mlocate cuộn lại thành một tùy chọn w / cli dịch vụ Windows nhỏ gọn, chặt chẽ. Ngoại trừ điều này cập nhật chỉ số của nó trong thời gian thực . Không có gì trên Linux đến gần. Nó sẽ là một trong số ít lần bạn sẽ nói "gee tôi ước hạt nhân chết tiệt này là một chút microsofty"


Tiện ích tốt đẹp. Cảm ơn vì đăng.
Sói Rudiger

1

Câu trả lời ngắn gọn là không có chính xác tương đương trên Windows . Cách giải quyết là sử dụng lệnh dir . Đây là lệnh danh sách thư mục hỗ trợ các ký tự đặc biệt và có thể được sử dụng như được chỉ ra trong câu trả lời được chấp nhận.

Lệnh Locate trên nhiều hệ thống giống như Unix là một tìm kiếm dựa trên chỉ mục. Nó hoạt động song song với lệnh Updateb lập chỉ mục các hệ thống tệp. Vì nó là một tìm kiếm dựa trên chỉ mục, nên nó thường nhanh hơn nhiều so với các lệnh tìm kiếm dựa trên văn bản như dirfind trên Unix, đặc biệt là khi tìm kiếm phân cấp thư mục sâu.


wherelà chính xác tương đương.
Alex78191

-3

Tôi không biết về bất kỳ phương pháp CLI nào để làm điều này trong Windows. Hãy nhớ rằng Windows CLI đã bị bỏ rơi bởi những người dùng thông thường, vì vậy nó cung cấp một bộ công cụ thường kém hoàn thiện hơn. Đặt cược tốt nhất của bạn có thể là sử dụng gnu findtrong Windows, mà bạn có thể nhận được từ GnuWin32 . Nếu bạn đang phát triển một tập lệnh, bạn chỉ cần đưa vào find.exevà các phần phụ thuộc của tập lệnh đó (đừng lo lắng, nó không lớn lắm).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.