Setara dengan Windows wildcarding direktori ls * (asterisk)?

14

Pertanyaan lain dari pengguna lama Unix / Linux yang menemukan dirinya di dunia Windows. Pertama, izinkan saya menjelaskan apa yang saya coba lakukan. Saya menggunakan shell Windows cmd.exe, dan saya ingin daftar semua direktori di bawah direktori saat ini yang berisi hirarki bin \ Debug, dan menentukan apakah mereka berisi file (misalnya: mencoba mencari tahu apakah target bersih NAnt saya adalah bekerja dengan baik). Hirarki saya mungkin terlihat seperti ini:

\Current
    \DirA
         \bin
             \Debug
                  (some files under debug)
             \Release
    \DirB
         \bin
             \Debug
    \DirC
         \bin
             \Release

Di Unix, ls */bin/Debughanya akan memberi saya daftar semua barang di DirA/bin/Debug, dan tunjukkan fakta yang DirB/bin/Debugkosong. Saya sudah mencoba berbagai contortions di shell cmd, tetapi tetap tutup dengan hal-hal seperti:

    > dir * \ bin \ Debug
    Nama file, nama direktori, atau sintaks label volume tidak benar.

    > dir * \ * \ *
    Nama file, nama direktori, atau sintaks label volume tidak benar.

Apakah ada sesuatu yang halus yang saya tidak mengerti tentang perintah dir, atau apakah hanya sebatas itu?

Ya, saya sadar bahwa saya bisa beralih ke explorer, navigasi, klik kanan, dan mungkin akhirnya membuat pencarian yang melakukan apa yang saya inginkan, tetapi saya lebih tertarik dengan solusi baris perintah quick-n-dirty.

Ogre Psalm33
sumber
Meskipun senang mengetahui tentang semua alat mirip unix yang dapat saya tambahkan ke Windows (dan percayalah saya menggunakan Cygwin di rumah!), Saya tidak akan selalu menyediakannya di mana pun saya pergi (dan memang mungkin tidak memiliki hak Admin untuk instal pada setiap PC yang saya gunakan).
Ogre Psalm33

Jawaban:

13

Sesuatu seperti ini harus melakukan apa yang Anda inginkan. Di direktori root dari jenis proyek:


c:\path\to\slndir>dir *.dll *.exe /s /b | findstr /i "bin\debug"

Argumen Dir: / s - rekursif, / b - "bare", tidak ada info tambahan
argumen findstr: / i - abaikan case

Secara umum, ' perintah bantuan ' akan menunjukkan bantuan untuk perintah shell. Jika itu tidak berhasil, maka
' perintah /?' biasanya akan menunjukkan bantuan.

james
sumber
Luar biasa! Saya menyadari ada banyak alat / toolkit di luar sana untuk membantu saya "linuxize" Windows saya, tetapi saya sedang mencari cara Windows untuk melakukan apa yang saya coba lakukan, dan inilah tepatnya!
Ogre Psalm33
7

Windows tidak melakukan wildcard seperti Linux. Hanya bagian nama file yang dapat berisi wildcard.

Anda dapat mengunduh versi ls yang berjalan di Windows dan menggunakannya. Saya sudah menggunakan Cygwin , tapi saya yakin ada yang lain.

Mark tebusan
sumber
Juga PowerShell
Joel Coehoorn
3
Satu hal yang perlu diingat: di Windows wildcard diperluas dengan perintah, bukan oleh shell.
Laurence Gonsalves
2

unxutils memiliki perintah ls. Masalahnya sebenarnya dengan shell windows. Pada unix shell Anda akan memperluas */bin/Debugke nama path yang relevan dan memberi mereka ke perintah ls sebagai argumen baris perintah yang terpisah.

Cygwin pasti akan melakukan trik untuk Anda, atau Anda bisa mencoba port windows dari shell unix seperti bash . Jika Anda ingin pergi rute scripting, Anda bisa membuat kode sesuatu dengan python cukup mudah menggunakan modul glob , dan sebagian besar bahasa scripting lainnya memiliki yang setara.

Tim Gilbert
sumber
2

Anda dapat melakukan sesuatu seperti "dir / s * .obj * lib". Ini akan memberikan ringkasan di akhir berapa banyak file yang cocok.

Joel Lucsy
sumber
Menutup. Saya memberi Anda alat peraga, tetapi jawaban James lebih dekat, karena menyaring file yang tidak di bawah \ debug untuk saya.
Ogre Psalm33
2
@for /D /r %P in (.) do @for %Q in ("%~fP\bin\Debug\*") do @echo %~ftzaQ

Tidak bagus, tetapi harus bekerja. Anda juga dapat memasukkan ke dalam file .cmd (lalu ganti setiap% menjadi double %%). Atau tentukan makro menggunakan doskey (ya, itu masih ada).

Pastikan ekstensi cmd diaktifkan.

EDIT: Cara kerjanya:

Yang pertama untuk loop berulang melalui semua subdirektori (/ D dan / r switch) secara iteratif. % ~ fP memperluas ke path lengkap dari direktori itu. Kemudian, itu menambahkan \ bin \ Debug * ke jalur itu. Yang kedua untuk loop menyebutkan semua file yang cocok. % ~ ftzaQ diperluas ke setiap file yang cocok dan dicetak ke layar oleh gema. % ~ FtzaQ yang aneh memformatnya seperti keluaran dir. Karakter @ menghindari bahwa perintah itu sendiri dicetak di layar.

Untuk lebih lanjut, lihat

Meinersbur
sumber
Saya mencoba ini dan memang berhasil. Tapi karena agak tidak berpengalaman dalam shell CMD, saya belum mengerti semuanya :-).
Ogre Psalm33
0

Di dunia Windows cmd.exe tidak memperluas wildcard - mereka bisa dilewatkan apa adanya ke program di baris perintah atau array argv. Karenanya setiap program mem-parsing dan memperluasnya secara berbeda, dan beberapa penggunaan yang lebih maju (seperti yang Anda cari) umumnya tidak didukung.

saran timgilbert untuk menggunakan Cygwin adalah saran yang bagus, juga paket GNUWin32 mungkin memiliki sesuatu yang akan membantu Anda.

Michael Burr
sumber