Setara dengan Unix menemukan perintah di Windows

34

Apa yang setara dengan perintah Unix find di Windows?

Saya melihat bahwa find.exepada Windows lebih seperti grep. Saya terutama tertarik pada yang setara

find . -name [filename]
ARV
sumber
2
Apakah ada yang salah dengan jawaban saya? Bisakah saya memperbaikinya? Apakah Anda masih membutuhkan bantuan?
JohannesM
Maaf, saya tidak melihat utas ini beberapa waktu yang lalu. Terima kasih atas jawaban dan permintaan maaf Anda karena tidak menerimanya lebih awal.
ARV

Jawaban:

21
dir <drive: [drive:]> /s | findstr /i <pattern>

- alternatif -

dir /s <drive:>\<pattern>

contoh

dir c: d: /s | findstr /i example.txt

- alternatif -

dir /s c:\example.txt
JohannesM
sumber
dir c: /s example.txtbekerja juga.
DevSolar
@DevSolar dapatkah Anda memeriksa kembali perintah Anda? Saya sudah mengujinya pada Windows 5.1 Build 2600 SP3, dan perintah Anda hanya memberi saya daftar file di direktori c:
JohannesM
1
Uh ... maaf. Melayani saya untuk mengetik dari memori. dir /s C:\example.txtini.
DevSolar
1
untuk hasil yang paling mirip saya gunakan \buntuk singkat (jalur keluaran saja); find <folder> -name <pattern>-> dir /s /b <folder><pattern>. Misalnya find /tmp -name *.txt-> dir \s \b C:\temp\*.txt. Namun dirselalu mengembalikan daftar jalur absolut, sedangkan findselalu memberikan jalur diawali dengan<folder>
Hashbrown
28

The Find-ChildItemCmdlet pada Windows Powershell adalah setara dengan Unix / Linux perintah find

http://windows-powershell-scripts.blogspot.in/2009/08/unix-linux-find-equivalent-in.html

Beberapa Opsi Find-ChildItem

  1. Find-ChildItem -Type f -Name ".*.exe"
  2. Find-ChildItem -Type f -Name "\.c$" -Exec "Get-Content {} | Measure-Object -Line -Character -Word"
  3. Find-ChildItem -Type f -Empty
  4. Find-ChildItem -Type f -Empty -OutObject
  5. Find-ChildItem -Type f -Empty -Delete
  6. Find-ChildItem -Type f -Size +9M -Delete
  7. Find-ChildItem -Type d
  8. Find-ChildItem -Type f -Size +50m -WTime +5 -MaxDepth 1 -Delete

Pengungkapan: Saya adalah pengembang Find-ChildItemcmdlet

Jagadish G
sumber
2
Terima kasih. Ini jelas lebih mengingat apa yang saya cari dalam menjawab pertanyaan ini.
supercheetah
7
Find-ChildItembukan cmdlet resmi dan tidak termasuk dalam PowerShell; Anda harus mengunduh cmdlet ini dari OneDrive seseorang . Tidak ada perbedaan antara itu dan hanya mengunduh bash, cygwin, unixutils atau program lain yang hanya memungkinkan Anda menjalankan UNIX find.
walen
19

Tanpa cmdlet tambahan terpasang, Anda cukup menggunakan Get-ChildItem:

Get-ChildItem -Filter *.zip -Recurse $pwd
djhaskin987
sumber
1
Dalam hal ini Anda mungkin ingin menggunakan salah satu alias pendek dir, lsatau gci, kecuali Anda menulis skrip.
Swonkie
5

Jika Anda menggunakan find Unix untuk mencari file dalam hierarki direktori, maka cara Powershell adalah dengan menggunakan Get-ChildItem(alias adalah gci) cmdlet dan memfilter hasilnya dengan cmdlet Where-Object(alias where) cmdlet.

Misalnya, untuk menemukan semua file (mulai dari C:\Users\dan secara rekursif) dengan kata 'esensial' dalam namanya, gunakan yang berikut ini:

PS> gci -Path "C:\Users\"  -Recurse | where {$_.Name -like '*essential*'}

The -likepilihan memungkinkan Anda untuk menggunakan wildcard untuk pencocokan pola.

Joshua Kan
sumber
2

Yang ini bukan GNU find, tetapi lebih cocok dengan linux command line philisophy di bawah PowerShell:

PS> dir -recurse -ea 0 | % FullName | sls <grep_string>

Contoh:

PS> cd C:\
PS> dir -recurse -ea 0 | % FullName | sls "Program" | sls "Microsoft"
PS> dir -recurse -ea 0 | % FullName | sls "Program" | sls "Microsoft" | out-gridview

Catatan: Semuanya dikembalikan setelah "|% FullName" adalah string, bukan objek.

Anda juga dapat menggunakan Where Operator, "?", Namun, ini lebih berfungsi, dan tidak jauh lebih cepat:

PS> cd C:\
PS> dir -Recurse -ea 0 | ? FullName -like "*Program*" 
                       | ? FullName -like "*Microsoft*" 
                       | % FullName 
                       | out-gridview

Berikut ini jalan pintas cepat:

PS> function myfind {dir -recurse -ea 0 | % FullName | sls $args }

PS> cd C:\
PS> myfind "Programs" | sls "Microsoft"

#find all text files recursively from current directory
PS> myfind "\.txt$"

#find all files recursively from current directory
PS> myfind .
Bill Moore
sumber
Cari -exec grep {} dari UnixUtils tidak berfungsi dengan baik sepertinya "tidak ada file atau direktori". Solusi ini: PowerShell.exe -Command "dir -Recurse -ea 0 |? FullName-like '* .log' | sls error", dari dalam skrip batch berfungsi. Catatan: harus menggunakan tanda kutip tunggal di dalam, tanda kutip ganda di luar.
kevinf