Bagaimana saya bisa secara rekursif menemukan semua file saat ini dan subfolder berdasarkan pencocokan wildcard?

1888

Bagaimana saya bisa secara rekursif menemukan semua file saat ini dan subfolder berdasarkan pencocokan wildcard?

john
sumber

Jawaban:

2742

Gunakan find untuk itu:

find . -name "foo*"

findmembutuhkan titik awal, dan .(titik) menunjuk ke direktori saat ini.

tux21b
sumber
21
Saya tahu ini ditandai sebagai linux tetapi ini layak disebutkan: path diperlukan untuk varian * nix lain yang bukan linux. Di linux, path bersifat opsional jika Anda ingin menggunakan dot.
IslandCow
4
@Seatter "foo *" memberitahu find untuk mencari semua file yang dimulai dengan "foo". Itu hanya contohnya. Anda dapat menggunakan "gpio *" untuk menemukan semua file yang namanya dimulai dengan gpio, atau hanya "gpio1" untuk menemukan semua file yang bernama gpio1.
schumacher574
29
perhatikan bahwa "foo *" dalam tanda kutip sehingga shell tidak memperluasnya sebelum meneruskannya untuk menemukannya. jika Anda baru saja melakukannya find . foo*, maka foo*akan diperluas DAN LALU berlalu untuk menemukan.
Grinch
33
Patut ditekankan bahwa " "sangat diperlukan untuk pencarian rekursif.
WesternGun
3
Juga berguna: Jika Anda tidak ingin diberitahu tentang direktori yang tidak memiliki izin untuk (atau kesalahan lain), Anda dapat melakukannyafind . -name "foo*" 2>/dev/null
Jobbo
222

Menemukan pipa ke grep seringkali lebih nyaman; itu memberi Anda kekuatan penuh ekspresi reguler untuk pencocokan wildcard sewenang-wenang.

Sebagai contoh, untuk menemukan semua file dengan string case foo "tidak sensitif" dalam nama file:

~$ find . -print | grep -i foo
Paul Whipp
sumber
58
findjuga memiliki tanda -iname,, -regexdan -iregextanda untuk wildcard, regex, dan pencocokan regex case-insensitive, sehingga pemipaan ke greptidak perlu.
iobender
7
Saya tidak berpikir ini tentang tidak perlu, tetapi lebih nyaman.
Elijah Lynn
1
Namun, perpipaan ke grep -v dapat memungkinkan Anda menggunakan string atau regex sederhana untuk menghapus entri yang tidak Anda inginkan.
door_number_three
3
@ iobender - Sedihnya, saya dapat memberi tahu Anda dari pengalaman bahwa tidak semua sistem datang dengan findperintah yang mendukung opsi-opsi itu. Terkadang grepmenjadi satu-satunya pilihan.
Tn. Llama
150

find akan menemukan semua file yang cocok dengan suatu pola:

find . -name "*foo"

Namun, jika Anda menginginkan gambar:

tree -P "*foo"

Semoga ini membantu!

IslandCow
sumber
18
brew install treeuntuk pengguna Mac OSX tanpa apt-getdiinstal
DeBraid
1
Diuji pada macOS Sierra, tambahkan saja '--print' -> 'find. nama "* foo" --print '. superuser.com/questions/177289/searching-mac-through-terminal
john-salib
2
sudo yum install tree -y untuk CentOS
Santosh Kumar Arjunan
39
find -L . -name "foo*"

Dalam beberapa kasus, saya membutuhkan parameter -L untuk menangani tautan direktori simbolik. Secara default, tautan simbolik diabaikan. Dalam kasus-kasus itu cukup membingungkan karena saya akan mengubah direktori ke sub-direktori dan melihat file yang cocok dengan pola tetapi menemukan tidak akan mengembalikan nama file. Menggunakan -L memecahkan masalah itu. Opsi tautan simbolik untuk find adalah -P -L -H

toddcscar
sumber
1
L switch sangat membantu. Banyak kali pengguna tidak memiliki ide tentang direktori yang mendasarinya, apakah mereka softlink atau direktori normal. Jadi, jika ragu, selalu baik menggunakan opsi L. Setidaknya, itu selalu membantu saya.
Ritesh
2
Itulah jawaban untuk saya. Terima kasih!
iedmrc
33

Jika shell Anda mendukung opsi globbing baru (dapat diaktifkan oleh:) shopt -s globstar, Anda dapat menggunakan:

echo **/*foo*

untuk menemukan file atau folder apa pun secara rekursif. Ini didukung oleh Bash 4, zsh dan shell serupa.


Secara pribadi saya mendefinisikan fungsi shell ini:

f() { find . -name "*$1*"; }

Catatan: Baris di atas dapat disisipkan langsung ke shell atau ditambahkan ke ~/.bashrcfile pengguna Anda .

Lalu saya bisa mencari file apa pun dengan mengetik:

f some_name

Atau Anda dapat menggunakan fdutilitas dengan sintaks sederhana, mis fd pattern.

kenorb
sumber
1
Ini hanya masuk ke tingkat tunggal. Tidak berulang ke sub direktori untuk saya
Broncha
3
@Broncha Karena Anda perlu mengaktifkan globbing yang diperluas dengan shopt -s globstarperintah. Ini didukung dalam Bash, zsh dan shell serupa.
kenorb
bash-3.2$ shopt -s globstarmemberibash: shopt: globstar: invalid shell option name
drewish
@drewish Anda harus meningkatkan versi Bash ke 4.x
kenorb
gema * / * foo kurang cepat daripada menemukan
Josef Klimuk
32

fd

Jika findterlalu lambat, coba fdutilitas - alternatif sederhana dan cepat untuk findditulis dalam Rust.

Sintaksis:

fd PATTERN

Demo:

Beranda: https://github.com/sharkdp/fd

kenorb
sumber
17
Pertama kali saya melihat gif pada SO dalam hampir 9 tahun. Pekerjaan yang baik!
Joshua Pinter
1
Hasil kinerja itu terlihat sangat menjanjikan. Anda dapat mempertimbangkan menambahkan fd ke buatan rumah ...
Gr3go
off topic: alat apa yang Anda gunakan untuk membuat file svg untuk demo?
aprodan
2
@aprodan Gambar demo disalin dari GitHub, tapi saya yakin mereka menggunakan asciinema, kemudian dikonversi ke format GIF, tapi saya tidak yakin.
kenorb
1
Sebenarnya ini format SVG, jadi mungkin asciicast2vectorbisa digunakan.
kenorb
27
find <directory_path>  -type f -name "<wildcard-match>"

Dalam wildcard-match Anda dapat memberikan string yang ingin Anda cocokkan misalnya * .c (untuk semua file c)

XYZ_Linux
sumber
1
Jawaban Anda adalah yang paling benar di sini karena hanya mencari file seperti yang ditentukan. Yang lain yang tidak menentukan jenis akan mengembalikan direktori.
wilsotc
jika Anda ingin mencari direktori "-type f" dapat diubah menjadi "-type d"
XYZ_Linux
11

Kamu bisa menggunakan:

# find . -type f  -name 'text_for_search'

Jika Anda ingin menggunakan penggunaan REGX -iname

# find . -type f  -iname 'text_for_search'
pengguna8848899
sumber
9

Perintah berikut akan mencantumkan semua file yang memiliki nama persis "pola" (misalnya) di folder saat ini dan subnya.

find ./ -name "pattern"

anshul
sumber
8

Cara default untuk mencari file rekursif, dan tersedia dalam banyak kasus

find . -name "filepattern"

Itu mulai traversing rekursif untuk nama file atau pola dari dalam direktori saat ini di mana Anda berada. Dengan perintah find, Anda dapat menggunakan wildcard, dan berbagai sakelar, untuk melihat daftar opsi, ketik

man find

atau jika halaman manual tidak tersedia di sistem Anda

find --help

Namun, ada alat yang lebih modern dan lebih cepat kemudian menemukan, yang melintasi seluruh sistem file Anda dan mengindeks file Anda, salah satu alat umum tersebut adalah mencari atau slocate / mlocate, Anda harus memeriksa manual OS Anda tentang cara menginstalnya, dan setelah itu diinstal itu perlu memulai database, jika skrip instal tidak melakukannya untuk Anda, itu bisa dilakukan secara manual dengan mengetik

sudo updatedb

Dan, untuk menggunakannya untuk mencari beberapa jenis file tertentu

locate filename

Atau, untuk mencari nama file atau derai dari dalam direktori saat ini, Anda dapat mengetik:

 pwd | xargs -n 1 -I {} locate "filepattern"

Ini akan melihat melalui database file dan dengan cepat mencetak nama jalur yang cocok dengan pola yang telah Anda ketik. Untuk melihat daftar lengkap opsi temukan, ketik: locate --helpatauman locate

Selain itu, Anda dapat mengonfigurasi loc untuk memperbarui database pada waktu yang dijadwalkan melalui pekerjaan cron, jadi cron sampel yang memperbarui db pukul 1AM akan terlihat seperti:

0 1 * * * updatedb

Pekerjaan cron ini perlu dikonfigurasi oleh root, karena updatedb membutuhkan hak akses root untuk melintasi seluruh sistem file.

Aleksandar Pavić
sumber
7

untuk pencarian file
find / -xdev -name settings.xml -> seluruh komputer
find ./ -xdev -name settings.xml -> direktori saat ini & sub direktori

untuk file dengan tipe ekstensi

find . -type f -name "*.iso"
Alberto
sumber
6

Saya terkejut melihat bahwa loc tidak banyak digunakan ketika kita akan pergi secara rekursif.

Pertama-tama saya akan mencari "$ PWD" untuk mendapatkan daftar file di folder saat ini yang menarik, dan kemudian jalankan greps pada mereka sesuka saya.

locate "$PWD" | grep -P <pattern>

Tentu saja, ini mengasumsikan bahwa updateb dilakukan dan indeks diperbarui secara berkala. Ini adalah cara yang jauh lebih cepat untuk menemukan file daripada menjalankan find dan memintanya turun pohon. Menyebutkan ini untuk kelengkapan. Tidak ada salahnya menggunakan find, jika pohon tidak terlalu berat.

melchi
sumber
locate "$PWD*.mp4" Hanya untuk mengingatkan bahwa Anda mungkin dapat melewatigrep
Gua Jefferey
5

Perintah di bawah ini membantu untuk mencari file

1) Terlepas dari kasus
2) Hasil Tidak termasuk folder tanpa izin
3) Pencarian dari root atau dari jalur yang Anda suka. Ubah / dengan jalur yang Anda inginkan.

Sintaks:
find -iname '' 2> & 1 | Contoh grep -v "Izin ditolak"


find / -iname 'C * .xml' 2> & 1 | grep -v "Izin ditolak"

find / -iname '*C*.xml'   2>&1 | grep -v "Permission denied"
MukeshKoshyM
sumber
1
kenapa kamu menggunakan grep untuk itu? Arahkan ulang stderr ke nullfind / -iname '*C*.xml' 2>/dev/null
phuclv
3

Jika Anda ingin mencari file khusus dengan wildcard, Anda dapat menggunakan kode berikut:

find . -type f -name "*.conf"

Misalkan, Anda ingin mencari setiap file .conf dari sini:

.berarti pencarian dimulai dari sini (tempat saat ini)
-typeberarti jenis item pencarian yang di sini adalah file (f).
-nameberarti Anda ingin mencari file dengan nama * .conf .

Reza Harasani
sumber
3

Ini akan mencari semua file terkait di direktori saat ini dan sub direktori, menghitung jumlah baris mereka secara terpisah serta sepenuhnya:

find . -name "*.wanted" | xargs wc -l
Jay Yang
sumber
2

Menggunakan

find path/to/dir -name "*.ext1" -o -name "*.ext2"

Penjelasan

  1. Parameter pertama adalah direktori yang ingin Anda cari.
  2. Secara default findmelakukan rekursi.
  3. The -osingkatan -or. Jadi di atas berarti mencari wildcard ini ATAU yang ini. Jika Anda hanya memiliki satu pola maka tidak perlu -o.
  4. Kutipan di sekitar pola wildcard diperlukan.
Shital Shah
sumber