Command na find sa Linux: paghahanap ng file ayon sa pangalan, laki, at petsa — mga halimbawa
Dinadaanan ng command na find ang puno ng direktoryo at pumipili ng mga file ayon sa kondisyon: find /path -name '*.log' ay naghahanap ayon sa pangalan, -type f para sa mga file lang, -size +100M para sa mas malaki sa 100 MB, at -mtime -7 para sa mga binago sa nakaraang linggo. Pinagsasama ang mga kondisyon, at maaaring magsagawa ng aksyon sa nahanap gamit ang -exec, -delete, o ipasa ang listahan sa xargs.
Dinadaanan ng command na find ang puno ng mga direktoryo at hinahanap ang mga file ayon sa kondisyon: pangalan, uri, laki, petsa ng pagbabago, may-ari, at mga pahintulot. Ang pangkalahatang anyo nito ay find [saan maghahanap] [mga kondisyon] [aksyon]. Narito ang mga find linux halimbawa para sa karaniwang gawain: makahanap ng config, mabura ang mga lumang log, o matukoy kung ano ang kumakain ng espasyo sa disk.
Sintaks ng command na find
find /var/log -type f -name '*.log' -mtime +30 -print
Hatiin natin ayon sa mga bahagi:
/var/log— panimulang punto. Maaaring maglagay ng maraming direktoryo o.(kasalukuyan). Kung walang path, ang GNU find ay naghahanap sa kasalukuyang direktoryo.-type f -name '*.log' -mtime +30— mga kondisyon (tinatawag ding tests sa dokumentasyon). Bilang default, ang pagitan nila ay lohikal na “AT”.-print— aksyon: ipakita ang path. Awtomatiko itong idinadagdag kung walang ibang aksyon.
Recursive na dumadaan ang find sa lahat ng nakapaloob na direktoryo. Kapag pinapatakbo ng ordinaryong user sa mga system path, mapupuno ng linyang Permission denied ang output. Alisin ang mga ito sa pamamagitan ng pag-redirect ng error stream:
find / -name 'nginx.conf' 2>/dev/null
Paghahanap ayon sa pangalan: -name at -iname
Ikinukumpara ng -name ang pangalan lang ng file (walang path) sa pattern. Sinusuportahan ng pattern ang * (kahit anong karakter), ? (isang karakter), at [abc] (isa sa mga nakalistang karakter).
# eksaktong pangalan
find /etc -name 'hosts'
# lahat ng file na .conf
find /etc -name '*.conf'
# hindi sensitibo sa letra: README.md, readme.MD, Readme.md
find ~/projects -iname 'readme.md'
# report_1.csv ... report_9.csv
find . -name 'report_?.csv'
Palaging ilagay sa quote ang pattern. Kung wala ang quote, ang shell mismo ang magpapalawak ng *.conf ayon sa mga file sa kasalukuyang direktoryo, kaya hindi pattern ang matatanggap ng find kundi listahan ng pangalan, at maaaring hindi inaasahan ang resulta o magka-error na paths must precede expression.
Paghahanap ayon sa path: -path at -regex
Kung mahalaga ang direktoryo at hindi lang ang pangalan, gamitin ang -path, na ikinukumpara sa buong path ang pattern:
# mga .js file sa loob lang ng mga direktoryong src
find . -path '*/src/*' -name '*.js'
Para sa mas kumplikadong pattern, mayroong -regex (regular expression din sa buong path) at -iregex na hindi sensitibo sa letra:
find . -regextype posix-extended -regex '.*\.(jpg|jpeg|png)$'
Paano laktawan ang isang direktoryo
Para hindi pumasok ang find, halimbawa sa node_modules o .git, ginagamit ang -prune:
find . -path ./node_modules -prune -o -name '*.js' -print
Binabasa ito nang ganito: “kung ang path ay ./node_modules, huwag na itong pasukin, kung hindi (-o), i-print ang mga file na *.js”. Kailangan ang tahasang -print sa dulo, kung hindi ay mapapasama rin sa output ang direktoryong hindi isinama. Mas simple pero mas mabagal ang -not -path '*/node_modules/*': dadaan pa rin ang find sa direktoryo, sinasala lang ang resulta.
Paghahanap ayon sa uri: -type
| Halaga | Hinahanap |
|---|---|
-type f | ordinaryong file |
-type d | mga direktoryo |
-type l | symbolic link |
-type s | socket |
-type p | named pipe (FIFO) |
# mga direktoryo lang na may pangalang logs
find / -type d -name 'logs' 2>/dev/null
# walang laman na file at walang laman na direktoryo
find . -type f -empty
find . -type d -empty
# sirang symbolic link
find . -xtype l
Paghahanap ayon sa laki: -size
Tumatanggap ang -size ng numero na may suffix: c — bytes, k — kilobytes, M — megabytes, G — gigabytes. Ang + ay nangangahulugang “mas malaki”, ang - ay “mas maliit”, at kung walang palatandaan ay “eksakto”.
# mga file na mas malaki sa 100 MB sa buong sistema
find / -type f -size +100M 2>/dev/null
# mula 10 hanggang 50 MB
find . -type f -size +10M -size -50M
# mas maliit sa 1 KB
find . -type f -size -1k
May isang detalye: bilugan pataas ang laki sa susunod na yunit. Kaya ang -size -1M ay makikita lang ang mga walang laman na file, dahil ang anumang hindi walang laman na file ay “hindi bababa sa 1 megabyte” pagkatapos ng pag-round. Para sa tumpak na hangganan, gumamit ng mas maliit na yunit: -size -1024k.
Ano ang kumukuha ng espasyo sa disk
Ang kombinasyon ng find, ls, at sort ay nagpapakita ng pinakamalalaking file:
find /var -type f -size +50M -exec ls -lh {} + 2>/dev/null | sort -k5 -rh | head
-rw-r----- 1 syslog adm 1.2G Oct 14 09:12 /var/log/syslog.1
-rw-r--r-- 1 root root 412M Oct 10 03:00 /var/backups/db.sql.gz
-rw-r----- 1 root adm 96M Oct 14 09:15 /var/log/nginx/access.log
Para sa pagtantya ng buong direktoryo, mas angkop ang du -sh; ang find naman ay mainam kapag isang malaking file sa malalim na bahagi ang kumain ng espasyo.
Paghahanap ayon sa petsa: -mtime, -mmin, -newer
Tatlong timestamp ang bawat file, at kayang i-filter ng find ang bawat isa:
| Kondisyon | Timestamp | Yunit |
|---|---|---|
-mtime / -mmin | pagbabago ng nilalaman | araw / minuto |
-atime / -amin | huling pagbasa | araw / minuto |
-ctime / -cmin | pagbabago ng metadata (pahintulot, may-ari, pangalan) | araw / minuto |
Pareho ang palatandaan sa laki: ang -mtime -7 ay binago wala pang 7 araw ang nakalipas, ang -mtime +30 ay mahigit 30 araw na ang nakalipas.
# binago sa huling linggo
find ~/projects -type f -mtime -7
# mga log na mas luma sa 30 araw
find /var/log -type f -name '*.log' -mtime +30
# binago sa huling 15 minuto
find /etc -type f -mmin -15
Ang araw ay binibilang sa buong panahon na 24 oras, at ang bahaging fraction ay tinatanggal. Dahil dito, ang -mtime +1 ay nakakahanap ng mga file na mas luma sa 48 oras, hindi 24 — madalas itong bitag. Kung kailangan ng katumpakan, lumipat sa minuto: -mmin +1440.
Mga file na mas bago kaysa sa ibang file o petsa
# binago pagkatapos ng huling pagbabago ng deploy.lock
find . -type f -newer deploy.lock
# binago pagkatapos ng partikular na petsa (GNU find)
find . -type f -newermt '2026-10-01'
# sa loob ng saklaw ng petsa
find . -type f -newermt '2026-10-01' ! -newermt '2026-10-08'
Paghahanap ayon sa may-ari at pahintulot
# mga file ng user na alice
find /home -user alice
# mga file na walang umiiral na may-ari (pagkatapos burahin ang user)
find / -nouser 2>/dev/null
# mga file na eksaktong may pahintulot 777
find /var/www -type f -perm 777
# mga file na maisusulatan ng lahat
find /var/www -perm -o=w
# mga file na may SUID bit — kapaki-pakinabang sa security audit
find / -perm -4000 -type f 2>/dev/null
Tatlo ang anyo ng -perm: walang palatandaan — eksaktong tugma ang pahintulot; may - — kahit papaano ay nakatakda ang lahat ng tinukoy na bit; may / — kahit isa sa mga ito ay nakatakda.
Lohika ng mga kondisyon: AT, O, HINDI
Bilang default, pinagsasama ang mga kondisyon gamit ang “AT”. Ang -o ay para sa “O”, at ang ! o -not ay para sa negasyon. Ang pagpapangkat ay gamit ang panaklong, na kailangang i-escape mula sa shell:
# mga larawang jpg o png
find . -type f \( -name '*.jpg' -o -name '*.png' \)
# lahat maliban sa mga file na .tmp
find . -type f ! -name '*.tmp'
Kung walang panaklong, ang -type f ay para lang sa unang kondisyon ng pares na “O”, at papasok sa resulta ang mga direktoryong may pangalang *.png. Kailangan ang mga espasyo sa paligid ng \( at \).
Lalim ng paghahanap: -maxdepth at -mindepth
# sa kasalukuyang direktoryo lang, walang nasa loob
find . -maxdepth 1 -type f -name '*.sh'
# simula sa ikalawang antas ng pagkakapaloob
find . -mindepth 2 -name '*.md'
# huwag lumipat sa ibang file system
find / -xdev -type f -size +1G
Ilagay ang -maxdepth kaagad pagkatapos ng path, bago ang ibang kondisyon, kung hindi ay magbibigay ng babala ang GNU find. Kapaki-pakinabang ang -xdev kapag naghahanap sa /: hindi papasok ang find sa /proc, mga network disk, at mga naka-mount na disk.
Mga aksyon sa nahanap: -exec, -delete, xargs
-exec: patakbuhin ang command para sa bawat file
Ipapalit ng find ang {} sa path ng file. Nagtatapos ang command sa \; o +:
# isang pagtakbo kada file
find . -name '*.sh' -exec chmod +x {} \;
# lahat ng file sa iisang listahan — mas mabilis
find . -name '*.log' -exec gzip {} +
# may kumpirmasyon para sa bawat file
find . -name '*.bak' -ok rm {} \;
Ang bersyong may + ay nagtitipon ng mga path sa mga batch at mas bihirang nagpapatakbo ng command, kaya sa libu-libong file ay ilang beses itong mas mabilis. Ang bersyong may \; ay kailangan kapag isang file lang ang tinatanggap ng command, o kapag hindi nasa dulo ang {}.
-delete: burahin ang nahanap
# tingnan muna kung ano ang mabubura
find /tmp/build -type f -name '*.o' -mtime +7
# saka burahin
find /tmp/build -type f -name '*.o' -mtime +7 -delete
Laging patakbuhin muna ang command nang walang -delete at suriin ang listahan. At ilagay ang -delete sa dulo: binabasa ng find ang expression mula kaliwa pakanan, kaya ang find . -delete -name '*.o' ay buburahin ang lahat sa direktoryo bago pa tingnan ang pangalan.
find at xargs
Klasikong kombinasyon ang ipasa ang listahan ng file sa ibang programa sa pamamagitan ng xargs. Para hindi masira sa mga pangalang may space, gamitin ang null byte bilang delimiter:
find . -type f -name '*.txt' -print0 | xargs -0 wc -l
Pinapatakbo nang sabay-sabay ng flag na -P sa xargs ang pagproseso:
find ./images -name '*.png' -print0 | xargs -0 -P 4 -n 10 optipng
find at grep: paghahanap ng teksto sa loob ng mga file
Ang find ay naghahanap ng mga file, hindi ng nilalaman nito. Para hanapin ang linya sa loob ng mga napiling file, ipasa ang mga ito sa grep:
# saan lumilitaw ang listen 8080 sa mga config
find /etc/nginx -type f -name '*.conf' -exec grep -Hn 'listen 8080' {} +
/etc/nginx/sites-enabled/app.conf:4: listen 8080;
Ipinapakita ng -H ang pangalan ng file, ang -n ang numero ng linya, at ang grep -l ay naglalabas lang ng mga pangalan ng file na may tugma. Kung extension lang ang kailangang filter, sapat na ang grep mismo: grep -rn --include='*.conf' 'listen 8080' /etc/nginx.
Sariling format ng output: -printf
Kayang mag-print ng GNU find hindi lang ng path. Halimbawa, laki, petsa, at pangalan:
find . -maxdepth 1 -type f -printf '%s\t%TY-%Tm-%Td\t%p\n' | sort -n
Dito, ang %s ay laki sa bytes, ang %T... ay petsa ng pagbabago sa mga bahagi, at ang %p ay path. Kapaki-pakinabang ito sa mga script: hindi na kailangang i-parse ang output ng ls.
Cheat sheet: mga find linux halimbawa sa araw-araw
| Gawain | Command |
|---|---|
| Hanapin ang file ayon sa pangalan | find / -name 'file.txt' 2>/dev/null |
| Hindi sensitibo sa letra | find . -iname '*.jpg' |
| Mga direktoryo lang | find . -type d -name 'cache' |
| Mga file na mas malaki sa 1 GB | find / -xdev -type f -size +1G |
| Binago sa nakaraang araw | find . -type f -mtime -1 |
| Binago sa nakaraang oras | find . -type f -mmin -60 |
| Burahin ang mga log na mas luma sa 30 araw | find /var/log/app -name '*.log' -mtime +30 -delete |
| Mga walang laman na direktoryo | find . -type d -empty |
| Palitan ang pahintulot ng lahat ng direktoryo | find . -type d -exec chmod 755 {} + |
| Teksto sa loob ng mga file | find . -name '*.py' -exec grep -l 'TODO' {} + |
| Bilangin ang mga file | find . -type f | wc -l |
Mga karaniwang pagkakamali
- Pattern na walang quote. Nasisira ang
find . -name *.logkapag may kahit isang.logsa kasalukuyang direktoryo. Isulat ang'*.log'. - Baha ng Permission denied. Idagdag ang
2>/dev/null, o patakbuhin gamit angsudokung talagang kailangan ang buong disk. -deletesa maling lugar. Laging nasa dulo ito, at bago ito dapat ay may pagsubok na pagtakbo nang walang pagbura.- Mga pangalang may space sa pipeline. Pinuputol ng
find ... | xargs rmang “My File.txt” sa dalawang argumento. Gamitin ang-print0atxargs -0, o-exec. - Pag-asang eksaktong araw ang
-mtime. Para sa eksaktong saklaw, gamitin ang-mmino-newermt.
Buod
Ang find ay pangkalahatang kasangkapan sa paghahanap sa file system: path, mga kondisyon ayon sa pangalan, uri, laki, petsa, at pahintulot, at pagkatapos ay ang aksyon. Matutunan ang limang haligi — -name, -type, -size, -mtime, at -exec ... + — at malulutas na ang karamihan ng gawain sa isang linya. Ulitin ang mga find linux halimbawang ito sa sarili mong terminal, at ang kombinasyon ng find sa grep, sed, at awk ay tinatalakay nang praktikal sa aralin ng kurso sa Linux tungkol sa pagproseso ng teksto sa terminal.
Mga madalas itanong
Ano ang pagkakaiba ng find at locate?
Naghahanap ang locate sa database ng mga pangalan na nabuo nang maaga, kaya agad ang resulta, pero hindi nito nakikita ang mga file na nalikha pagkatapos ng huling pag-update ng database gamit ang updatedb. Dinadaanan ng find ang disk sa real time at kayang mag-filter ayon sa laki, petsa, at pahintulot.
Paano maghanap ng file ayon sa nilalaman nito, hindi sa pangalan?
Hindi binabasa ng find mismo ang nilalaman. Gamitin ang grep -rn 'teksto' /path, o ang kombinasyong find . -name '*.conf' -exec grep -l 'teksto' {} +.
Bakit mabagal ang find sa root ng disk?
Dinadaanan nito ang lahat ng direktoryo, kasama ang /proc, /sys, at mga naka-mount na disk. Limitahan ang paghahanap sa tiyak na direktoryo, magdagdag ng -xdev at -maxdepth, o ibukod ang mga hindi kailangan gamit ang -prune.
Maaari bang ayusin ayon sa petsa ang resulta ng find?
Oo: find . -type f -printf '%T@ %p\n' | sort -n ay naglalabas ng mga file mula sa pinakaluma hanggang sa pinakabago, kung saan ang %T@ ay oras ng pagbabago sa segundo mula sa epoch.
Paano hanapin at burahin ang mga walang laman na direktoryo?
Ang find . -type d -empty -delete ay bubura sa lahat ng walang laman na direktoryo, kasama ang mga nawalan ng laman matapos burahin ang mga nakapaloob. Patakbuhin muna ito nang walang -delete at suriin ang listahan.
Detalyadong tinatalakay ang paksang ito, may praktis, sa kursong “Linux: с нуля до уверенного администрирования”.
Pumunta sa kurso