Unix-type“ ค้นหา” บน Windows?


17

ใช้ Windows CLI (cmd) วิธีหนึ่งจะค้นหาไฟล์ที่เขารู้ส่วนหนึ่งของชื่อได้อย่างไร ตัวอย่างเช่นเวิร์กสเตชัน Windows ทุกเครื่องติดตั้ง javac ในตำแหน่งที่แตกต่างกันจะพบได้อย่างไรจาก Windows CLI (cmd)

Googling ฉันเห็นเฉพาะการใช้ GUI ของ Windows Explorer (ตัวจัดการไฟล์) หรือดาวน์โหลดแอพพลิเคชั่นฟรีแวร์ Windows ไม่มีคำสั่งค้นหาในตัวหรือไม่? รุ่นเซิร์ฟเวอร์มีหรือไม่ ฉันไม่ต้องการที่จะติดตั้ง cygwin หรืออะไรอื่น ๆ เหล่านี้มักจะไม่ใช่เครื่องของฉัน


3
ไม่มีอะไรในตัวกับบรรทัดคำสั่งของ Windows ที่คล้ายกันมากในการค้นหา ฉันจะแนะนำ locate32 ( locate32.net )
John T

javacโดยปกติควรจะอยู่ในสถานที่เดียวกัน ...
Tamara Wijsman

1
@JohnT ตำแหน่งนั้นไม่ทำงานอีกต่อไป - หน้าแรก find32 ที่ได้รับการอัปเดตคือlocate32.cogit.net
TrojanName

1
ลอง Git-Bash.exe aka 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 'ไม่สนใจระบบไฟล์
Jürgen A. Erhard

1
@ JürgenA.Erhardให้ความเป็นธรรม ... Linux เองไม่สนใจ 'ระบบไฟล์' อย่างที่ Windows นำเสนอ (สำหรับความเข้าใจที่ จำกัด ) ในทุกวันนี้ถ้าคุณต้องการค้นหา PowerShell มากกว่าหนึ่งไดรฟ์ ถึงแม้ว่าในขณะที่คุณสามารถจัดกลุ่มวอลุ่มและปืน Get-ChildItem ของพวกเขาทั้งหมดเข้าด้วยกัน
Windos

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

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
ความรู้สึกนี้นานเกินไปที่จะพิมพ์ออกมา
Tamara Wijsman

2
Get-ChildItem สามารถย่อเป็นหรือgci ls
digitxp

โชคดีที่แตกต่างจากในcmdในPowerShellคุณสามารถใช้ "แท็บ" เพื่อดูคำแนะนำเหมือนในลินุกซ์ ดังนั้นจึงไม่ใช่เรื่องที่จะพิมพ์จริงนัก และในกรณีของฉันlsใน PowerShell ไม่ทำงาน
WesternGun

3

ฉันก็มีโปรแกรมค้นหาสำหรับ Windows คุณเพียงแค่ต้องทำตามคำแนะนำในการอ่านและคัดลอกไฟล์. dll และ. exe ไปที่ system32

ทางเลือกรวมถึงการเพิ่มโปรแกรมพา ธ ไปยังตัวแปรสภาพแวดล้อม PATH

แนวคิดคือการหาตำแหน่งบน Windows หากคุณกำลังมองหาบางสิ่งที่ "ชอบ" ในการค้นหา :)


ขอบคุณ Cheeku ที่ดูเหมือนว่าแอพพลิเคชั่นที่มีประโยชน์ อย่างไรก็ตามฉันพูดถึงว่าฉันไม่สามารถติดตั้งแอปพลิเคชั่นบนระบบได้ตามปกติแล้วไม่ใช่ระบบของฉัน
dotancohen

2
ใช่ แต่ฉันตอบแล้วเพราะคนอื่น ๆ เช่นฉันสามารถพบว่ามีประโยชน์และคนอื่น ๆ จะไม่สับสนเพราะโพสต์นี้มีคำตอบที่ยอมรับแล้ว!
Cheeku

1
locateอยู่บนคอมพิวเตอร์ Win7 ของฉัน มันบ่นเกี่ยวกับฐานข้อมูลที่มีอายุ 435 วันเมื่อ intallation มีอายุไม่เกิน 3 เดือน และupdatedbไม่รวมอยู่
vinnief

@vinnief นั่นเป็นปัญหาเฉพาะกับการติดตั้งของคุณฉันเข้าใจ
Cheeku

1
@Cheeku - นี้เป็น app เดียวกันชี้ไปที่จอห์น T มันไม่ใช่ CLI ตามที่ OP ถาม แต่มันยอดเยี่ยม
sancho.s Reinstate Monica

2

คำถามค่อนข้างคลุมเครือ

คุณต้องการค้นหาไฟล์ (ระบุไว้ในเนื้อความของ OP) แต่คุณต้องการคำสั่ง / แอป "ค้นหาประเภท" (ระบุไว้ในชื่อเรื่อง) มีการพิจารณาอย่างละเอียดอ่อนหนึ่งเรื่องที่มีนัยยะสำคัญ คุณสามารถค้นหาด้วยสองวิธีที่แตกต่างกัน:

  1. ค้นหาโครงสร้างต้นไม้เป้าหมายโดยตรงในการค้นหาแต่ละครั้ง (ช้า)

  2. ขั้นแรกสร้างฐานข้อมูลของโครงสร้างแผนผังเป้าหมาย (อาจใช้เวลานาน) จากนั้นค้นหาโดยการค้นหาฐานข้อมูล (เร็วมาก) ฐานข้อมูลจะต้องมีการปรับปรุงเป็นระยะเพื่อให้ได้ผลลัพธ์ที่ดีในการค้นหา ดูhttp://en.wikipedia.org/wiki/Locate_%28Unix%29

Unix locateเป็นของ "type 2" แต่ตามเนื้อความของ OP ของคุณคุณจะใช้ได้กับสองวิธีใด ๆ ยิ่งกว่านั้นคุณถามเฉพาะเกี่ยวกับตัวเลือก CLI

ฉันแสดงรายการตัวเลือกด้านล่างและระบุว่าเป็น CLI / GUI พิมพ์ 1/2 และเพิ่มความคิดเห็น

  1. http://locate32.cogit.net/ (ชี้โดยJohn Tแล้วโดยCheeku ) GUI, ประเภท 2 มีรุ่นพกพาอยู่ ความง่ายในการใช้งานที่โดดเด่นและความสามารถในการกำหนดค่า คล้ายกับ Unix locate(ซึ่งฉันใช้และชอบมาก)
    หมายเหตุ : ถูกใช้ในการยูนิกซ์Updatedbการค่อนข้างนานในการปรับปรุงฐานข้อมูล (แน่นอนว่ามันขึ้นอยู่กับขนาดของต้นไม้ที่สแกน) ผมพบlocate32 มากได้อย่างรวดเร็ว ฉันไม่รู้ว่ามันจะดีขึ้นมากได้อย่างไร

  2. http://sourceforge.net/projects/winlocate/ CLI พิมพ์ 2

  3. ผบ [ชื่อไฟล์] / 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 เพื่อค้นหาและอัพเดตแล้ว ใช้ SQLite เป็นแบ็กเอนด์และมีตัวติดตั้งอัตโนมัติ แค่

.\Invoke-Locate.ps1 -install. 

locates ใช้เวลาประมาณ 300ms / แบบสอบถาม

แล้วก็

locate whatever

และคุณกำลังตั้งค่า

ป้อนคำอธิบายรูปภาพที่นี่

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



2

ฉันรู้ว่าสิ่งนี้ถูกตอบมานานแล้ว แต่นี่เป็นสคริปต์ของฉันที่จะจำลองฟังก์ชั่นค้นหาที่ใช้ในยูนิกซ์ / ลินุกซ์

บันทึกสิ่งนี้เป็น locate.bat และวางใน System32 หรือเรียกใช้จากไดเรกทอรีที่เก็บไว้ใช้พารามิเตอร์เดียวเช่น "cmd> ค้นหา javac.exe"

สวิตช์ค้นหา / c (เป็นพารามิเตอร์ตัวที่ 2 จะนับจำนวนอินสแตนซ์) และค้นหา /? จะแสดงข้อความช่วยเหลือ

@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: เราได้รับความสุขกับทุกสิ่งที่ค้นหา รูปภาพ dmenu + find + mlocate ถูกรวมเข้ากับบริการ Windows ที่มีตัวเลือกน้อย / แน่น ยกเว้นสิ่งนี้ปรับปรุงดัชนีในเวลาจริง ไม่มีอะไรใน Linux เข้ามาใกล้ มันจะเป็นหนึ่งในไม่กี่ครั้งที่คุณจะพูดว่า "gee ฉันหวังว่าเคอร์เนลยี้นี้เป็นอีกเล็กน้อย Microsofty"


ยูทิลิตี้ที่ดี ขอบคุณสำหรับการโพสต์
Rudiger Wolf

1

คำตอบสั้น ๆ คือว่ามีไม่เท่าที่แน่นอนบน Windows วิธีแก้ไขคือใช้คำสั่งdir นี่คือคำสั่งรายการไดเรกทอรีที่รองรับอักขระพิเศษและสามารถใช้ตามที่ระบุไว้ในคำตอบที่ยอมรับได้

ค้นหาคำสั่งในหลายระบบปฏิบัติการยูนิกซ์เช่นระบบคือการค้นหาตามดัชนี มันทำงานควบคู่กับคำสั่งUpdatedbที่ดัชนีระบบไฟล์ เนื่องจากเป็นการค้นหาตามดัชนีจึงมักจะเร็วกว่าคำสั่งการค้นหาแบบข้อความเช่นdirและfindบน Unix โดยเฉพาะอย่างยิ่งเมื่อค้นหาลำดับชั้นไดเรกทอรีลึก


whereเทียบเท่าที่แน่นอน
Alex78191

-3

ฉันไม่ทราบวิธีการ CLI ใด ๆ ที่จะทำใน Windows โปรดทราบว่าผู้ใช้ทั่วไปของ Windows CLI ถูกทอดทิ้งดังนั้นจึงมีชุดเครื่องมือที่อายุน้อยกว่าโดยทั่วไป ทางออกที่ดีที่สุดของคุณอาจจะใช้ GNU findใน Windows ซึ่งคุณสามารถได้รับจากGnuWin32 หากคุณกำลังพัฒนาสคริปต์คุณจะต้องรวมfind.exeและการอ้างอิงกับสคริปต์ (ไม่ต้องกังวลมันไม่ใหญ่มาก)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.