Apa yang setara dengan Linux dari DOS "dir / s / b filename"?

17

Daftar semua file / dir di atau di bawah direktori saat ini yang cocok dengan 'nama file'.

Mackenir
sumber

Jawaban:

28

Setara langsung adalah

find . -iname <filename>

yang akan mencantumkan semua file dan direktori yang dipanggil <filename>dalam direktori saat ini dan setiap subdirektori, mengabaikan case.

Jika versi pencarian Anda tidak mendukung -iname, Anda dapat menggunakannya -name. Perhatikan bahwa tidak seperti itu -iname, -namepeka terhadap huruf besar-kecil.

Jika Anda hanya ingin mendaftar file yang dipanggil <filename>, dan bukan direktori, tambahkan-type f

find . -iname <filename> -type f

Jika Anda ingin menggunakan wildcard, Anda perlu memberi tanda kutip di sekitarnya, misalnya

find . -iname "*.txt" -type f

jika tidak, shell akan mengembangkannya.

Seperti yang telah ditunjukkan orang lain, Anda juga dapat melakukan:

find . | grep "\.txt$"

grep akan mencetak garis berdasarkan ekspresi reguler, yang lebih kuat daripada wildcard, tetapi memiliki sintaks yang berbeda.

Lihat man finddan man grepuntuk lebih jelasnya.

Mikel
sumber
3
Jika <filename>berisi wildcard, gunakan tanda kutip di sekitarnya, mis find . -name '*.txt'.
Gilles 'SO- stop being evil'
@Gilles, perbarui jawaban saya untuk mengatakan itu, terima kasih.
Mikel
2
Menggunakan <filename>sebagai penanda untuk input pengguna adalah kebiasaan buruk di lingkungan baris perintah, di mana < and >sebagian besar waktu memiliki makna tertentu. Saya sarankan hanya menggunakan filename, mungkin FILENAME untuk menekankannya. Kebanyakan orang akan mengerti, dan mereka, yang tidak mau, dapat membahayakan ketika tidak memahami bahwa mereka tidak seharusnya mencapai tanda kurang dari atau lebih besar dari pada.
pengguna tidak diketahui
2
<filename>adalah konvensi dalam banyak dokumentasi UNIX, jadi saya pikir ini berguna bagi orang untuk menyadarinya, tapi saya setuju FILENAMEmungkin lebih mudah untuk dipahami.
Mikel
1
find -iname <filename>lebih baik karena case-insensitive seperti DOS
Agnel Kurian
8

Beberapa kerang memungkinkan ls **/filename, yang cukup nyaman.

Shawn J. Goff
sumber
1
Poin bagus. Di versi bash terbaru, menjalankan shopt -s globstar; echo **/filenamesetara dengan find . -name "filename". Ini juga berfungsi di zsh.
Mikel
Ini ls ** / nama file` baik-baik saja, tetapi tampaknya tidak lebih dari satu level direktori.
Sopalajo de Arrierez
@ sopalajo-de-arrierez Jika Anda melakukannya shopt -s globstar, itu mungkin akan bekerja untuk Anda. Penggumpalan rekursif adalah fitur yang hanya tersedia di beberapa shell, dan kadang-kadang tidak diaktifkan secara default.
Shawn J. Goff
Ops ... Saya mengerti sekarang, @ ShawnJ.Goff: shoptperintah memungkinkan opsi globstar on. Sekarang ini berfungsi seperti pesona. Terima kasih banyak.
Sopalajo de Arrierez
4

Anda dapat melakukannya dengan

find . | egrep filename
Matten
sumber
1
Anda juga bisa melakukannya bersama find . -regextype posix-egrep -regex '.*filename.*'(Saya tidak tahu apakah egrepbagian itu penting, tetapi Anda menggunakan egrepjawaban Anda jadi saya memasukkannya)
Michael Mrozek
Anda bisa, tetapi grep berbeda dari perintah DOS yang setara. grepmenggunakan ekspresi reguler, sedangkan perintah DOS menggunakan shell wildcard.
Mikel
1
Kalau dipikir-pikir itu, gumpalan shell juga berbeda dari wildcard DOS. Misalnya, find . -name "*.*"tidak akan melakukan apa yang Anda harapkan dari latar belakang DOS. Glob cukup dekat untuk dikenali, sementara regex adalah binatang yang sama sekali baru.
Jander
Apa yang *.*.*dilakukan dalam dos modern yaitu windows cmd? Bagaimana dengan *.*.*.*?
ctrl-alt-delor
0

Itu bisa juga: tree -if </your/path>atau 'pwd'sebagai jalan

Michael Fatahov
sumber