Qidirish — find, which, glob naqshlar

~12 daq · Linux · Fayl tizimi

Muammodan boshlaylik

  • "Serverda nginx.conf qayerda edi?"
  • "Loyihadagi barcha .log fayllarni 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 *.js ni 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] -delete dan oldin buyruqni -delete siz ishga tushiring va ro'yxatni ko'ring. -delete oxirida 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 "\.js
quot;

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 yashirish
  • which — dastur yo'li; locate — tez indeks; fd — zamonaviy
  • Mazmun bo'yicha qidirish — grep -r

Keyingi dars

10-dars: Havolalar — ln, symlink va hard link