Amri ya find kwenye Linux: kutafuta faili kwa jina, ukubwa na tarehe — mifano
Amri find hupitia mti wa saraka na kuchagua faili kwa masharti: find /path -name '*.log' hutafuta kwa jina, -type f faili tu, -size +100M kubwa kuliko MB 100, -mtime -7 zilizobadilishwa ndani ya wiki. Masharti yanaunganishwa, na juu ya yaliyopatikana unaweza kutekeleza kitendo kwa -exec, -delete, au kutuma orodha kwa xargs.
Amri find hupitia mti wa saraka na kupata faili kwa masharti: jina, aina, ukubwa, tarehe ya mabadiliko, mmiliki na ruhusa. Mpangilio wa jumla ni find [mahali pa kutafuta] [masharti] [kitendo]. Hapa chini kuna mifano ya find linux kwa kazi za kawaida: kupata faili ya usanidi, kufuta kumbukumbu za zamani, na kujua kinachojaza diski.
Sintaksia ya amri ya find
find /var/log -type f -name '*.log' -mtime +30 -print
Hebu tuangalie sehemu kwa sehemu:
/var/log— mahali pa kuanzia. Unaweza kutaja saraka kadhaa mfululizo au.(ya sasa). Bila njia, GNU find hutafuta kwenye saraka ya sasa.-type f -name '*.log' -mtime +30— masharti (katika nyaraka huitwa majaribio). Kati yake, kwa chaguo-msingi, kuna «NA» ya kimantiki.-print— kitendo: kuchapisha njia. Huwekwa yenyewe ikiwa hakuna kitendo kingine.
find hufanya kazi kwa kurudia, ndani ya saraka zote ndogo. Ukiiendesha kama mtumiaji wa kawaida kwenye njia za mfumo, pato litajaa mistari ya Permission denied. Ziondoe kwa kuelekeza mkondo wa makosa:
find / -name 'nginx.conf' 2>/dev/null
Kutafuta kwa jina: -name na -iname
Sharti -name linalinganisha jina la faili pekee (bila njia) na muundo. Muundo unaunga mkono * (herufi yoyote), ? (herufi moja) na [abc] (moja kati ya zilizoorodheshwa).
# jina halisi
find /etc -name 'hosts'
# faili zote za .conf
find /etc -name '*.conf'
# bila kujali herufi kubwa au ndogo: README.md, readme.MD, Readme.md
find ~/projects -iname 'readme.md'
# report_1.csv ... report_9.csv
find . -name 'report_?.csv'
Muundo daima weka ndani ya nukuu. Bila nukuu, shell yenyewe itapanua *.conf kwa faili za saraka ya sasa, na find itapokea orodha ya majina badala ya muundo — matokeo yatakuwa yasiyotarajiwa au amri itashindwa na hitilafu paths must precede expression.
Kutafuta kwa njia: -path na -regex
Ikiwa saraka ni muhimu, si jina pekee, tumia -path — hulinganisha muundo na njia nzima:
# faili za .js ndani ya saraka za src pekee
find . -path '*/src/*' -name '*.js'
Kwa muundo tata kuna -regex (regex pia kwa njia kamili) na -iregex bila kujali herufi kubwa au ndogo:
find . -regextype posix-extended -regex '.*\.(jpg|jpeg|png)$'
Jinsi ya kuruka saraka
Ili find isiingie, kwa mfano, node_modules au .git, hutumika -prune:
find . -path ./node_modules -prune -o -name '*.js' -print
Inasomeka hivi: «ikiwa njia ni ./node_modules, usiingie ndani yake, vinginevyo (-o) chapisha faili *.js». -print ya wazi mwishoni ni lazima, vinginevyo saraka iliyoruka nayo itaingia kwenye pato. Njia rahisi zaidi lakini ya polepole ni -not -path '*/node_modules/*': find bado itapitia saraka, ila itachuja matokeo tu.
Kutafuta kwa aina: -type
| Thamani | Inatafuta nini |
|---|---|
-type f | faili za kawaida |
-type d | saraka |
-type l | viungo vya mfano (symbolic links) |
-type s | soketi |
-type p | mabomba yenye majina (FIFO) |
# saraka zenye jina logs pekee
find / -type d -name 'logs' 2>/dev/null
# faili tupu na saraka tupu
find . -type f -empty
find . -type d -empty
# viungo vya mfano vilivyoharibika
find . -xtype l
Kutafuta kwa ukubwa: -size
Sharti -size hupokea namba yenye kiambishi: c — baiti, k — kilobaiti, M — megabaiti, G — gigabaiti. Ishara + ina maana «kubwa zaidi», - — «ndogo zaidi», bila ishara — «sawasawa».
# faili kubwa kuliko MB 100 katika mfumo mzima
find / -type f -size +100M 2>/dev/null
# kutoka MB 10 hadi 50
find . -type f -size +10M -size -50M
# ndogo kuliko KB 1
find . -type f -size -1k
Kuna jambo la kuzingatia: ukubwa huzungushwa juu hadi kipimo kinachofuata. Kwa hiyo -size -1M itapata faili tupu pekee — faili yoyote isiyo tupu huchukua «angalau megabaiti 1» baada ya kuzungusha. Kwa mipaka sahihi tumia vipimo vidogo: -size -1024k.
Kinachochukua nafasi kwenye diski
Mchanganyiko wa find na ls na sort unaonyesha faili kubwa zaidi:
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
Kwa kukadiria saraka nzima ni rahisi zaidi du -sh, na find ni nzuri pale ambapo faili moja kubwa mahali fulani ndani kabisa ndiyo iliyokula nafasi.
Kutafuta kwa tarehe: -mtime, -mmin, -newer
Kila faili lina alama tatu za wakati, na find inaweza kuchuja kwa kila moja:
| Sharti | Alama | Kipimo |
|---|---|---|
-mtime / -mmin | mabadiliko ya yaliyomo | siku / dakika |
-atime / -amin | usomaji wa mwisho | siku / dakika |
-ctime / -cmin | mabadiliko ya metadata (ruhusa, mmiliki, jina) | siku / dakika |
Ishara zinafanya kazi kama kwenye ukubwa: -mtime -7 — imebadilishwa chini ya siku 7 zilizopita, -mtime +30 — zaidi ya siku 30 zilizopita.
# zilizobadilishwa katika wiki iliyopita
find ~/projects -type f -mtime -7
# kumbukumbu za zaidi ya siku 30
find /var/log -type f -name '*.log' -mtime +30
# zilizobadilishwa dakika 15 zilizopita
find /etc -type f -mmin -15
Siku zinahesabiwa kama vipindi kamili vya saa 24, sehemu ya ziada inatupwa. Kwa sababu hiyo -mtime +1 hupata faili zilizo zaidi ya saa 48, si 24 — mtego wa kawaida. Ikiwa unahitaji usahihi, nenda kwa dakika: -mmin +1440.
Faili mpya kuliko faili nyingine au tarehe
# zilizobadilishwa baada ya deploy.lock kubadilishwa
find . -type f -newer deploy.lock
# zilizobadilishwa baada ya tarehe maalum (GNU find)
find . -type f -newermt '2026-10-01'
# ndani ya kipindi cha tarehe
find . -type f -newermt '2026-10-01' ! -newermt '2026-10-08'
Kutafuta kwa mmiliki na ruhusa
# faili za mtumiaji alice
find /home -user alice
# faili zisizo na mmiliki aliyepo (baada ya kufuta mtumiaji)
find / -nouser 2>/dev/null
# faili zenye ruhusa 777 haswa
find /var/www -type f -perm 777
# faili zinazoweza kuandikwa na kila mtu
find /var/www -perm -o=w
# faili zenye biti ya SUID — muhimu wakati wa ukaguzi wa usalama
find / -perm -4000 -type f 2>/dev/null
Kwa -perm kuna aina tatu: bila ishara — ruhusa zinalingana kabisa, kwa - — angalau biti zote zilizotajwa zimewekwa, kwa / — angalau moja kati yake imewekwa.
Mantiki ya masharti: NA, AU, SI
Masharti kwa chaguo-msingi yanaunganishwa kwa «NA». Kwa «AU» kuna -o, kwa kukanusha — ! au -not. Kupanga kwa vikundi hufanyika kwa mabano, ambayo lazima yaepushwe kutoka kwa shell:
# picha za jpg au png
find . -type f \( -name '*.jpg' -o -name '*.png' \)
# kila kitu isipokuwa faili za .tmp
find . -type f ! -name '*.tmp'
Bila mabano, -type f itahusishwa na sharti la kwanza tu la jozi ya «AU», na saraka zenye jina *.png zitaingia kwenye matokeo. Nafasi kuzunguka \( na \) ni lazima.
Kina cha kutafuta: -maxdepth na -mindepth
# kwenye saraka ya sasa tu, bila zilizo ndani
find . -maxdepth 1 -type f -name '*.sh'
# kuanzia ngazi ya pili ya kuingia ndani
find . -mindepth 2 -name '*.md'
# usihamie kwenye mifumo mingine ya faili
find / -xdev -type f -size +1G
Weka -maxdepth mara baada ya njia, kabla ya masharti mengine — vinginevyo GNU find itatoa onyo. Chaguo -xdev ni muhimu unapotafuta kwenye /: find haitaingia kwenye /proc, diski za mtandao na zilizounganishwa.
Vitendo juu ya vilivyopatikana: -exec, -delete, xargs
-exec: kutekeleza amri kwa kila faili
Mahali pa {} find itaweka njia ya faili. Amri inamalizika kwa \; au +:
# mwito mmoja kwa kila faili
find . -name '*.sh' -exec chmod +x {} \;
# faili zote kwa orodha moja — haraka zaidi
find . -name '*.log' -exec gzip {} +
# kwa uthibitisho wa kila faili
find . -name '*.bak' -ok rm {} \;
Chaguo la + hukusanya njia kwenye makundi na kuendesha amri mara chache zaidi, kwa hiyo kwenye maelfu ya faili ni kwa mara kadhaa haraka zaidi. Chaguo la \; linahitajika pale amri inapokubali faili moja tu, au {} iko si mwishoni.
-delete: kufuta vilivyopatikana
# kwanza angalia kitakachofutwa
find /tmp/build -type f -name '*.o' -mtime +7
# kisha futa
find /tmp/build -type f -name '*.o' -mtime +7 -delete
Endesha amri bila -delete kila mara na ukague orodha. Na weka -delete mwishoni: find hutekeleza usemi kutoka kushoto kwenda kulia, na find . -delete -name '*.o' itafuta kila kitu kwenye saraka kabla ya kuangalia jina.
find na xargs
Mchanganyiko wa kawaida ni kupitisha orodha ya faili kwa programu nyingine kupitia xargs. Ili isivunjike kwa majina yenye nafasi, tumia kitenganishi cha baiti sifuri:
find . -type f -name '*.txt' -print0 | xargs -0 wc -l
Bendera -P ya xargs huendesha usindikaji kwa sambamba:
find ./images -name '*.png' -print0 | xargs -0 -P 4 -n 10 optipng
find na grep: kutafuta maandishi ndani ya faili
find hutafuta faili, si yaliyomo ndani yake. Ili kupata mstari ndani ya faili zilizochaguliwa, zipitishe kwa grep:
# mahali listen 8080 inapatikana kwenye mafaili ya usanidi
find /etc/nginx -type f -name '*.conf' -exec grep -Hn 'listen 8080' {} +
/etc/nginx/sites-enabled/app.conf:4: listen 8080;
Bendera -H huchapisha jina la faili, -n — namba ya mstari, na grep -l itaonyesha majina ya faili yenye mlingano pekee. Ikiwa chujio ni kwa kiambishi tu, grep yenyewe inatosha: grep -rn --include='*.conf' 'listen 8080' /etc/nginx.
Muundo wako wa pato: -printf
GNU find inaweza kuchapisha zaidi ya njia tu. Kwa mfano, ukubwa, tarehe na jina:
find . -maxdepth 1 -type f -printf '%s\t%TY-%Tm-%Td\t%p\n' | sort -n
Hapa %s ni ukubwa kwa baiti, %T... — tarehe ya mabadiliko kwa vipande, %p — njia. Hii ni rahisi kwa script: hakuna haja ya kuchambua pato la ls.
Karatasi ya kudanganya: mifano ya find linux kila siku
| Kazi | Amri |
|---|---|
| Tafuta faili kwa jina | find / -name 'file.txt' 2>/dev/null |
| Bila kujali herufi kubwa au ndogo | find . -iname '*.jpg' |
| Saraka pekee | find . -type d -name 'cache' |
| Faili kubwa kuliko GB 1 | find / -xdev -type f -size +1G |
| Zilizobadilishwa ndani ya siku | find . -type f -mtime -1 |
| Zilizobadilishwa ndani ya saa | find . -type f -mmin -60 |
| Futa kumbukumbu zaidi ya siku 30 | find /var/log/app -name '*.log' -mtime +30 -delete |
| Saraka tupu | find . -type d -empty |
| Badilisha ruhusa za saraka zote | find . -type d -exec chmod 755 {} + |
| Mfuatano ndani ya faili | find . -name '*.py' -exec grep -l 'TODO' {} + |
| Hesabu faili | find . -type f | wc -l |
Makosa ya kawaida
- Muundo bila nukuu.
find . -name *.loghuvunjika ikiwa kwenye saraka ya sasa kuna hata faili moja.log. Andika'*.log'. - Mafuriko ya Permission denied. Ongeza
2>/dev/nullau endesha kwasudoikiwa kweli unahitaji diski nzima. -deletemahali pasipo sahihi. Huwa mwishoni kila wakati, na kabla yake kuna uendeshaji wa majaribio bila kufuta.- Majina yenye nafasi kwenye bomba.
find ... | xargs rmitagawanya «My File.txt» kuwa hoja mbili. Tumia-print0naxargs -0au-exec. - Kutarajia siku sahihi kutoka
-mtime. Kwa vipindi sahihi chukua-mminau-newermt.
Muhtasari
find ni chombo cha jumla cha kutafuta kwenye mfumo wa faili: njia, kisha masharti ya jina, aina, ukubwa, tarehe na ruhusa, kisha kitendo. Jifunze nguzo tano — -name, -type, -size, -mtime na -exec ... + — na kazi nyingi zitatatuliwa kwa mstari mmoja. Mifano hii ya find linux inafaa kujaribiwa kwenye terminal yako, na mchanganyiko wa find na grep, sed na awk tunauchambua kwa vitendo katika somo la kozi ya Linux kuhusu kuchakata maandishi kwenye terminal.
Maswali ya mara kwa mara
find inatofautianaje na locate?
locate hutafuta kwa kutumia hifadhidata ya majina iliyojengwa awali, kwa hiyo ni ya papo hapo, lakini haioni faili zilizoundwa baada ya hifadhidata kusasishwa kwa amri ya updatedb. find hupitia diski kwa wakati halisi na inaweza kuchuja kwa ukubwa, tarehe na ruhusa.
Nitapataje faili kwa maudhui yake, si kwa jina?
find yenyewe haisomi maudhui. Tumia grep -rn 'maandishi' /njia au mchanganyiko find . -name '*.conf' -exec grep -l 'maandishi' {} +.
Kwa nini find inafanya kazi polepole kwenye mzizi wa diski?
Hupitia saraka zote, pamoja na /proc, /sys na diski zilizounganishwa. Punguza utafutaji kwenye saraka maalum, ongeza -xdev na -maxdepth, au toa vya ziada kwa -prune.
Je, ninaweza kupanga matokeo ya find kwa tarehe?
Ndiyo: find . -type f -printf '%T@ %p\n' | sort -n itaorodhesha faili kutoka za zamani hadi mpya, ambapo %T@ ni wakati wa mabadiliko kwa sekunde tangu epoch.
Nitapataje na kufuta saraka tupu?
Amri find . -type d -empty -delete itafuta saraka zote tupu, pamoja na zile zilizokuwa tupu baada ya kufuta zilizo ndani yake. Kwanza iendeshe bila -delete na ukague orodha.
Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Linux: с нуля до уверенного администрирования”.
Nenda kwenye kozi