Qidirish — find, which, glob naqshlar
Muammodan boshlaylik
- "Serverda
nginx.confqayerda edi?" - "Loyihadagi barcha
.logfayllarni o'chirish kerak" - "Disk to'ldi — 100 MB dan katta fayllar qayerda?"
- "Oxirgi kunda qaysi fayllar o'zgardi?"
Har bir papkani ls bilan qarab chiqish — imkonsiz. Bularning hammasiga bitta vosita javob beradi: find.
find — asosiy shakl
find QAYERDA SHARTLAR [HARAKAT]
find . -name "app.js"
find /etc -name "nginx.conf"
./src/app.js
/etc/nginx/nginx.conf
find papkani ichki papkalari bilan to'liq ko'rib chiqadi.
[!INFO] Naqshni qo'shtirnoqqa oling:
-name "*.js". Aks holda shell*.jsni find ga yetib bormasdan joriy papkada kengaytirib yuboradi (7-dars).
Nom bo'yicha
find . -name "*.log" # .log bilan tugaydigan
find . -iname "readme*" # registrga sezgir emas: README.md, readme.txt
find . -name "*.test.js"
find / -name "php.ini" 2>/dev/null
2>/dev/null — "Permission denied" xatolarini yashirish (13-dars). Butun / bo'ylab qidirganda ko'p bo'ladi.
Tur bo'yicha
find . -type f -name "*.js" # faqat fayllar
find . -type d -name "node_modules" # faqat papkalar
find . -type l # havolalar
Hajm bo'yicha
find / -type f -size +100M 2>/dev/null # 100 MB dan katta
find . -size -1k # 1 KB dan kichik
find . -type f -empty # bo'sh fayllar
+ — katta, - — kichik. Birliklar: k, M, G.
Vaqt bo'yicha
find . -mtime -1 # oxirgi 1 kun ichida o'zgargan
find . -mtime +30 # 30 kundan oldin o'zgargan
find . -mmin -10 # oxirgi 10 daqiqada
find /var/log -name "*.log" -mtime +7 # 7 kundan eski loglar
-mtime — kunlar, -mmin — daqiqalar. - — "kamroq oldin" (yangiroq), + — "ko'proq oldin" (eskiroq).
Shartlarni birlashtirish
Bir nechta shart — standart holatda VA:
find . -type f -name "*.js" -size +50k
YOKI — -o:
find . -name "*.jpg" -o -name "*.png"
EMAS — ! yoki -not:
find . -type f ! -name "*.md"
Papkalarni chetlab o'tish
node_modules ichida qidirish — sekin va keraksiz:
find . -path ./node_modules -prune -o -name "*.js" -print
Yoki oddiyroq (lekin baribir ichiga kiradi):
find . -name "*.js" -not -path "*/node_modules/*"
Chuqurlikni cheklash:
find . -maxdepth 2 -name "package.json"
Topilganlar bilan harakat
-delete
find . -name "*.tmp" -delete
find /var/log/dokon -name "*.log" -mtime +14 -delete
[!WARNING]
-deletedan oldin buyruqni-deletesiz ishga tushiring va ro'yxatni ko'ring.-deleteoxirida bo'lsin — shartlar oldidan qo'yilsa, hamma narsani o'chirib yuborishi mumkin.
-exec
Har bir topilgan fayl uchun buyruq; {} — fayl nomi:
find . -name "*.sh" -exec chmod +x {} \;
find . -name "*.js" -exec grep -l "console.log" {} \;
\;— har bir fayl uchun alohida+— hammasini bitta buyruqqa (tezroq):
find . -name "*.log" -exec ls -lh {} +
15-darsda xargs bilan yana bir usulni ko'ramiz.
Boshqa qidirish vositalari
which va type — dastur qayerda
which node
type -a python3
/usr/bin/node
python3 is /usr/bin/python3
locate — juda tez
sudo apt install plocate
locate nginx.conf
find diskni har safar ko'rib chiqadi; locate — tayyor indeksdan qidiradi (bir zumda). Indeks kuniga bir marta yangilanadi — yangi fayllar ko'rinmasligi mumkin (sudo updatedb).
fd — zamonaviy find
sudo apt install fd-find # Ubuntu da buyruq: fdfind
fdfind "\.jsquot;
Soddaroq sintaksis, tezroq, .gitignore ni hurmat qiladi (node_modules ga kirmaydi).
Fayl ichida qidirish
find — fayl nomi va xususiyatlari bo'yicha. Fayl mazmunida qidirish — grep (14-dars):
grep -r "DATABASE_URL" .
Amaliy misollar
# Disk qayerda to'ldi — eng katta 10 ta fayl
find / -type f -size +50M -exec ls -lh {} + 2>/dev/null | sort -k5 -h | tail -10
# Loyihadagi barcha node_modules papkalarni o'chirish
find ~/loyihalar -name node_modules -type d -prune -exec rm -rf {} +
# Bugun o'zgargan .js fayllar
find src -name "*.js" -mtime -1
# Bo'sh papkalarni o'chirish
find . -type d -empty -delete
Nima uchun shunday?
Nima uchun find va grep alohida buyruqlar — bitta "qidirish" vositasi yetarli emasmi?
UNIX falsafasi: har bir dastur bitta ishni yaxshi qiladi. find — fayl tizimi daraxtini aylanib, xususiyatlar (nom, hajm, vaqt, tur) bo'yicha tanlaydi. grep — matn oqimida qatorlarni topadi. Ular alohida bo'lgani uchun birlashtiriladi: find fayllarni tanlaydi, -exec grep ularning ichida qidiradi, natija sort ga, keyin head ga... Har bir qism oddiy va tushunarli, lekin birgalikda — har qanday "qidirish" vositasidan kuchliroq.
Xulosa
Eslab qoling:
find QAYERDA shartlar harakat; naqsh — qo'shtirnoqda-name/-iname,-type f/d,-size +100M,-mtime -1,-maxdepth N- VA — standart; YOKI —
-o; EMAS —! -delete— avval usiz tekshiring-exec buyruq {} \;yoki{} +2>/dev/null— ruxsat xatolarini yashirishwhich— dastur yo'li;locate— tez indeks;fd— zamonaviy- Mazmun bo'yicha qidirish —
grep -r
Keyingi dars
10-dars: Havolalar — ln, symlink va hard link