Topish (Unix) - find (Unix) - Wikipedia

topmoq
Asl muallif (lar)Dik Xayt
Tuzuvchi (lar)AT&T Bell Laboratories
Operatsion tizimUnix, Unixga o'xshash, IBM i
PlatformaO'zaro faoliyat platforma
TuriBuyruq
Litsenziyatopilmalar: GPLv3 +

Yilda Unixga o'xshash va boshqalar operatsion tizimlar, topmoq a buyruq qatori yordam dasturi topadi fayllar ba'zilariga asoslanib foydalanuvchi - belgilangan mezonlarni belgilaydi va keyin har bir mos keladigan ob'ektga ba'zi bir talab qilingan amallarni qo'llaydi.

U kerakli boshlang'ich joydan qidirishni boshlaydi va keyin rekursiv ravishda o'tadi tugunlar (kataloglar) ierarxik tuzilish (odatda a daraxt ). topmoq boshlang'ich katalogiga o'rnatilgan bir yoki bir nechta saqlash moslamalariga tegishli bo'limlarning turli xil fayl tizimlarini kesib o'tishi va qidirishi mumkin.[1]

Mumkin bo'lgan qidiruv mezonlariga quyidagilar kiradi naqsh ga qarshi o'yin Fayl nomi yoki faylni o'zgartirish vaqti yoki kirish vaqtiga mos keladigan vaqt oralig'i. Avvalboshdan, topmoq joriy ostidagi barcha fayllar ro'yxatini qaytaradi ishchi katalog, garchi foydalanuvchilar qidiruvni boshlang'ich katalog ostidagi istalgan istalgan maksimal darajadagi cheklashlari mumkin.

Tegishli topmoq dasturlar orqali olingan indekslangan fayllar bazasidan foydalanadi topmoq (muntazam ravishda yangilanadi, odatda tomonidan cron ish) butun fayl tizimini nomlari bo'yicha fayllarni qidirishning tezroq usulini ta'minlash.

Tarix

topmoq ichida paydo bo'ldi 5-versiya Unix qismi sifatida Programmer's Workbench loyihasi, va Dik Xayt tomonidan yozilgan cpio,[2] birgalikda foydalanishga mo'ljallangan edi.[3]

The GNU topmoq amalga oshirish dastlab Erik Decker tomonidan yozilgan. Keyinchalik Devid MakKenzi, Jey Plett va Tim Vud tomonidan takomillashtirildi.[4]

The topmoq buyrug'i ham IBM i operatsion tizim.[5]

Sintaksisini toping

$ topmoq [-H|-L] yo'l ... [operand_expression ...]

Ikki variant qanday qilib boshqarilishini nazorat qiladi topmoq buyruq ramziy havolalarni ko'rib chiqishi kerak. Odatiy xatti-harakatlar hech qachon ramziy havolalarga amal qilmaydi. -L bayrog'i sabab bo'ladi topmoq ramziy havolalarga amal qilish buyrug'i. -H bayrog'i faqat buyruq satri argumentlarini qayta ishlash paytida ramziy havolalarga amal qiladi. Ushbu bayroqlar uchun POSIX standartida ko'rsatilgan topmoq.[6] Umumiy kengaytma -P bayrog'i bo'lib, quyidagi simvol aloqasini aniq o'chirib qo'yadi.[7]

Ifoda oldida kamida bitta yo'l bo'lishi kerak. topmoq tarjima qilishga qodir joker belgilar ichki va buyruqlarni boshqarish uchun diqqat bilan keltirilishi kerak qobiq globbing.

Ifoda elementlari buyruq qatori argumenti chegara, odatda qobiq sintaksisida bo'sh joy sifatida ifodalanadi. Ular chapdan o'ngga baholanadi. Ular tarkibida AND (-va yoki -a) va OR (yoki yoki -o) kabi mantiqiy elementlar, shuningdek predikatlar (filtrlar va amallar) bo'lishi mumkin.

GNU topmoq POSIX tomonidan ko'rsatilmagan ko'plab qo'shimcha funktsiyalar mavjud.

Bashoratlar

Odatda ishlatiladigan ibtidoiylar quyidagilarni o'z ichiga oladi:

  • - ism naqsh - fayl nomi berilgan qobiq-glob naqshiga mos kelishini tekshiradi.
  • -tip turi - faylning berilgan turi ekanligini tekshiradi. Unix fayl turlari qabul qilinganlarga quyidagilar kiradi:
  • -print - har doim to'g'ri qaytadi; joriy fayl nomini va yangi qatorni stdout.
  • -print0 - har doim to'g'ri qaytadi; joriy fayl nomini va nol belgisini stdout. POSIX tomonidan talab qilinmaydi.
  • -exec dastur [argument ...]; - har doim to'g'ri qaytadi; berilgan argumentlar va faylning joriy yo'li bilan dasturni ishga tushirish.
  • -exec dastur [argument ...] {} + - har doim to'g'ri qaytadi; berilgan argumentlarni va iloji boricha ko'proq yo'llarni (masalan, buyruq satrining maksimal hajmiga qadar) dasturni ishga tushiring xargs ). Ko'pgina dasturlarda {} ning qo'shimcha hodisalari berilgan ismning qo'shimcha nusxalarini bildiradi (bu xususiyat POSIX tomonidan talab qilinmaydi).[7]
  • -ok dastur [argument ...]; - yoqadi -exec, lekin dastur 0 ga qaytishiga qarab true yoki false qiymatini qaytaradi.

Agar ifoda hech biridan foydalanmasa -print0, -print, -exec, yoki -ok, ijro etish uchun standartlarni toping -print agar shartlar haqiqat sifatida sinovdan o'tkazilsa.

Operatorlar

Find buyrug'i ifodalarini yaxshilash uchun operatorlardan foydalanish mumkin. Operatorlar ustuvorlikning pasayishi tartibida keltirilgan:

  • (expr) - kuchlarning ustuvorligi;
  • ! expr - agar ifoda noto'g'ri bo'lsa, to'g'ri;
  • expr1 expr2 (yoki expr1 -a expr2) - Va. agar expr1 noto'g'ri bo'lsa, expr2 baholanmaydi;
  • expr1 -o expr2 - Yoki. expr1 to'g'ri bo'lsa, expr2 baholanmaydi.
$ topmoq. - ism 'fileA_ *' -o -name 'fileB_ *'

Ushbu buyruq nomlari "fileA_" yoki "fileB_" bilan boshlangan fayllarni joriy ishchi katalog daraxtidan qidiradi. Biz keltiramiz fileA_ * qobiq uni kengaytirmasligi uchun.

$ topmoq. - ism 'foo.cpp' '!' - yo'l '.svn'

Ushbu buyruq nomi "foo.cpp" bo'lgan fayllarni ".svn" pastki katalog daraxtidan tashqari joriy ishchi katalog daraxtidan qidiradi. Biz keltiramiz ! shuning uchun u qobiq tomonidan tarixni almashtirish belgisi sifatida talqin qilinmaydi.

POSIXni cheksiz chiqishdan himoya qilish

Haqiqiy dunyodagi fayl tizimlari ko'pincha yordamida yaratilgan pastadirli tuzilmalarni o'z ichiga oladi qiyin yoki yumshoq havolalar. The POSIX standarti shuni talab qiladi

The topmoq kommunal xizmat cheksiz ilmoqlarni aniqlaydi; ya'ni duch kelgan so'nggi faylning ajdodi bo'lgan ilgari tashrif buyurilgan ma'lumotnomani kiritish. Agar u cheksiz harakatni aniqlasa, topmoq standart xatoga diagnostika xabarini yozishi va iyerarxiyadagi o'rnini tiklashi yoki tugatishi kerak.

Misollar

Joriy ishchi katalogdan

$ topmoq. - ism 'mening *'

Bu nomlar bilan boshlangan fayllarni joriy ishchi katalog daraxtidan qidiradi mening. Yagona tirnoqlardan qochish qobiq kengayish - ularsiz qobiq o'rnini bosadi mening * nomlari boshlangan fayllar ro'yxati bilan mening joriy ish katalogida. Dasturning yangi versiyalarida katalog tashlab ketilishi mumkin va u joriy ishchi katalogni nazarda tutadi.

Faqat oddiy fayllar

$ topmoq. - ism 'mening *' -f turi

Bu yuqoridagi qidiruv natijalarini faqat oddiy fayllar bilan cheklaydi, shuning uchun kataloglar, maxsus fayllar, ramziy havolalar va hk. mening * bitta tirnoq (apostrof) ichiga kiritilgan, chunki aks holda qobiq uni joriy ish katalogidagi fayllar ro'yxati bilan boshlanib, mening

Buyruqlar

Oldingi misollar natijalar ro'yxatini yaratdi, chunki sukut bo'yicha topmoq bajaradi -print harakat. (Esda tutingki, ning dastlabki versiyalari topmoq buyruqda hech qanday standart harakat yo'q edi; natijada olingan fayllar ro'yxati foydalanuvchilarni sarosimaga solib tashlanadi.)

$ topmoq. - ism 'mening *' f -ls turi

Bu kengaytirilgan fayl ma'lumotlarini bosib chiqaradi.

Barcha kataloglarni qidirish

$ find / -name myfile -type f -print

Bu har bir katalogni nomi oddiy faylni qidiradi myfile va uni ekranga chiqaradi. Odatda fayllarni shu tarzda qidirish yaxshi emas. Bu ancha vaqt talab qilishi mumkin, shuning uchun katalogni aniqroq ko'rsatish yaxshiroqdir. Ba'zi operatsion tizimlar o'zaro bog'liq bo'lmagan dinamik fayl tizimlarini o'rnatishi mumkin topmoq. Fayl nomlari, shu jumladan qobiq uchun maxsus belgilar, bitta tirnoq bilan qo'shilishi kerak bo'lishi mumkin.

Bitta katalog daraxtidan boshqasini qidiring

$ topish / -path chiqarib tashlangan_path -prune -o -type f -name myfile -print

Bu katalog katalogidan tashqari barcha kataloglarni qidiradi chiqarib tashlangan_path tomonidan kesilgan (to'liq yo'l, shu jumladan etakchi /) -qora olxo'ri nomi, oddiy fayl uchun harakat myfile.

Katalogni ko'rsating

$ find / home / weedly -name myfile -type f -print

Bu qidiradi / uy / begona o'tlar nomli oddiy fayllar uchun katalog daraxti myfile. Siz doimo katalogni eslab qolishingiz mumkin bo'lgan eng chuqur darajaga belgilashingiz kerak.

Bir nechta kataloglarni qidirish

$ topmoq mahalliy / tmp -name mydir -type d -print

Bu qidiradi mahalliy joriy ishchi katalogning pastki katalog daraxti va / tmp nomli kataloglar uchun katalog daraxti mydir.

Xatolarga e'tibor bermang

Agar siz buni rootdan tashqari foydalanuvchi sifatida qilsangiz, ruxsat berilgan (va boshqa har qanday) xatolarni e'tiborsiz qoldirishingiz mumkin. Xatolar bosilganligi sababli stderr, chiqishni / dev / null-ga yo'naltirish orqali ularni bostirish mumkin. Buni bosh qobig'ida qanday qilish kerakligini quyidagi misolda keltirilgan:

$ find / -name myfile -type f -print 2> / dev / null

Agar siz a csh yoki tcsh foydalanuvchi, siz yo'naltira olmaysiz stderr yo'naltirishsiz stdout shuningdek. Ni ishlatish uchun sh dan foydalanishingiz mumkin topmoq Buning atrofida buyruq bering:

$ sh -c "find / -name myfile -type f -print 2> / dev / null"

Foydalanishda alternativ usul csh yoki tcsh chiqishni quvurga o'tkazishdir stdout va stderr ichiga grep buyruq. Ushbu misolda ruxsat etilmagan xatolarni o'z ichiga olgan qatorlarni qanday bostirish mumkinligi ko'rsatilgan.

$ topmoq. -fayl nomini bering |& grep -v 'Ruxsat berilmadi'

Boshqa nomlangan fayllardan birini qidirib toping

$ topmoq. \( - ism '* jsp' -o -name '* java' \) f -ls turi

The -llar operator kengaytirilgan ma'lumotlarni chop etadi va misolda "jsp" yoki "java" bilan tugaydigan har qanday oddiy fayl topiladi. Qavslar zarurligini unutmang. Ko'pgina chig'anoqlarda qavslarni teskari burish bilan olib qochish kerak (\( va \)) ularni maxsus qobiq belgilari sifatida talqin qilishning oldini olish. The -llar operatori barcha versiyalarida mavjud emas topmoq.

Amalni bajaring

$ find / var / ftp / mp3 -name '* .mp3' -tip f -exec chmod 644 {} \;

Ushbu buyruq ruxsatnomalar nomlari bilan tugaydigan barcha oddiy fayllar .mp3 katalog daraxtida / var / ftp / mp3. Aktsiya bayonotni belgilash orqali amalga oshiriladi -exec chmod 644 {} \; buyruqda. Ismi tugaydigan har bir oddiy fayl uchun .mp3, buyruq chmod 644 {} o'rniga almashtirish amalga oshiriladi {} fayl nomi bilan. Vertikal (qobiq buyruq ajratuvchi sifatida talqin qilinmasligi uchun teskari tomonga burilgan) buyruq tugaganligini bildiradi. Ruxsat 644, odatda ko'rsatilgan rw-r - r--, fayl egasiga faylni o'qish va yozish uchun to'liq ruxsat beradi, boshqa foydalanuvchilar esa faqat o'qish huquqiga ega. Ba'zi chig'anoqlarda {} iqtibos keltirilishi kerak. Orqada ";"odatda etakchi bilan kotirovka qilinadi"\", lekin xuddi shunday samarali tarzda bitta tirnoq ichiga olinishi mumkin.

Buyruqning o'zi bo'lishi kerakligini unutmang emas iqtibos keltirish; aks holda siz kabi xato xabarlarini olasiz

topish: aks sado "mv ./3bfn rel071204": Bunday Fayl yoki katalog mavjud emas

bu degani topmoq "nomli faylni ishga tushirishga urinmoqdaaks sado "mv ./3bfn rel071204""va muvaffaqiyatsiz.

Agar siz ko'plab natijalar bo'yicha ish olib boradigan bo'lsangiz, unda fayl nomlarini to'playdigan exec boshlang'ich versiyasidan foydalanish samaraliroq ARG_MAX keyin fayl nomlari ro'yxati bilan buyruqni bajaradi.

$ topmoq. -exec buyrug'i {} +

Bu bo'shliqlar bilan fayl nomlari bajarilganlarga uzatilishini ta'minlaydi BUYURT qobiq tomonidan bo'linmasdan.

Fayllarni va kataloglarni o'chirish

The - o'chirish aksiya - bu GNU kengaytmasi va undan foydalanish yoqiladi - chuqurlik. Shunday qilib, agar siz find buyrug'ini sinab ko'rsangiz -print o'rniga - o'chirish bunga borishdan oldin nima bo'lishini aniqlash uchun siz foydalanishingiz kerak - chuqurlik - bosma.

Bo'sh fayllarni o'chiring va nomlarini chop eting (e'tibor bering - bo'sh - bu GNU-ning noyob kengaytmasi topmoq umuman mavjud bo'lmasligi mumkin topmoq amalga oshirish):

$ topmoq. - bo'sh - o'chirish - chop etish

Bo'sh oddiy fayllarni o'chirish:

$ topmoq. - f turi - bo'sh - o'chirish

Bo'sh kataloglarni o'chirish:

$ topmoq. -type d-bo'sh-o'chirish

"Bad" nomli bo'sh fayllarni o'chirish:

$ topmoq. -name yomon-bo'sh-o'chirish

Ogohlantirish. - The - o'chirish harakatlar kabi shartlar bilan ishlatilishi kerak - bo'sh yoki - ism:

$ topmoq. - o'chirish # bu hammasini o'chirib tashlaydi.

Ipni qidiring

Ushbu buyruq / tmp katalog daraxtidagi barcha fayllarni qator uchun qidiradi:

$ / tmp -type f -exec grep ni toping 'qidirish satri' / dev / null '{}' \+

The / dev / null argument topilgan matndan oldin fayl nomini ko'rsatish uchun ishlatiladi. Usiz faqat topilgan matn chop etiladi. GNU grep ushbu vazifani bajarish uchun o'zi ishlatilishi mumkin:

$ grep -r 'qidirish satri' / tmp

Jsmith uy katalogi daraxtidan "LOG" izlash misoli:

$ ~ jsmith -exec grep LOG-ni toping '{}' / dev / null \; -print/home/jsmith/scripts/errpt.sh:cp $ LOG $ FIXEDLOGNAME/home/jsmith/scripts/errpt.sh:cat $ LOG/ home / jsmith / scripts / title: USER = $ LOGNAME

Amaldagi katalog daraxtidagi barcha XML fayllarida "ERROR" qatorini qidirish misoli:

$ topmoq. - ism "* .xml" -exec grep "XATO" / dev / null '{}' \+

Ushbu misolda izlash satrini o'rab turgan ikkita tirnoq ("") va qavslarni o'rab turgan bitta tirnoq ('') ixtiyoriy, ammo bo'shliqlar va boshqa ba'zi maxsus belgilarga ruxsat berish uchun kerak. Murakkab matnli eslatma (ayniqsa, "sh" va "csh" dan kelib chiqqan eng mashhur chig'anoqlarda) bitta tirnoq ko'pincha oson tanlovdir, chunki ikkilangan tirnoqlar barcha maxsus talqinlarga to'sqinlik qilmaydi. Inglizcha kontraksiyoni bo'lgan fayl nomlarini keltirish, bu juda murakkablashishi mumkinligini ko'rsatadi, chunki unda apostrof qo'yilgan satrni ikki tirnoq bilan himoya qilish osonroq:

$ topmoq. - ism "faylni o'z ichiga olmaydi" -exec grep "qila olmaydi" '{}' \; -print

Foydalanuvchiga tegishli bo'lgan barcha fayllarni qidiring

$ topmoq. -user 

Sezgir bo'lmagan holatlarda qidirish

Yozib oling - ism standartda emas va barcha dasturlar tomonidan qo'llab-quvvatlanmasligi mumkin.

$ topmoq. - ism 'MyFile *'

Agar - ism tizimingizda kalit qo'llab-quvvatlanmaydi, shunda vaqtinchalik echim texnikasi quyidagicha bo'lishi mumkin:

$ topmoq. - ism '[mM] [yY] [fF] [iI] [lL] [eE] *'

Bu foydalanadi Perl siz uchun yuqoridagi buyruqni yaratish uchun (umuman olganda bunday foydalanish xavfli, chunki standart belgilar "sh" ga kiritilishidan oldin maxsus belgilar to'g'ri keltirilgan emas):

$ aks sado 'MyFile *' | perl -pe s / ([a-zA-Z]) / [ L  1  U  1] / g; s /(.*)/ toping. -name  1 / ' | sh

Fayllarni o'lchamlari bo'yicha qidirish

100 kilobaytdan 500 kilobaytgacha bo'lgan fayllarni qidirish:

$ topmoq. -siz + 100k -a -siz -500k

Bo'sh fayllarni qidirish:

$ topmoq. - 0k o'lcham

Bo'sh bo'lmagan fayllarni qidirish:

$ topmoq. ! - 0k o'lcham

Fayllarni nomlari va o'lchamlari bo'yicha qidirish

$ toping / usr / src! \( - ism '*, v' -o -name '. *, v' \) '{}' \; -print

Ushbu buyruq / usr / src katalog daraxtini qidiradi. '*, V' va '. *, V' shaklidagi barcha fayllar chiqarib tashlangan. Shuni ta'kidlash kerakki, muhim dalillar ko'rsatma bu sichqoncha tugmachasida ko'rsatiladi.

uchun fayl `topish / tanlash \( -name error_log -o -name 'access_log' -o -name 'ssl_engine_log' -o -name 'rewrite_log' -o -name 'catalina.out' \) -siz + 300000k -a -siz -5000000k`; qil  cat / dev / null> $ fileamalga oshirildi

Birliklar [bckw] dan biri bo'lishi kerak, 'b' 512 baytli bloklarni, 'c' baytni, 'k' kilobaytni va 'w' 2 baytli so'zlarni bildiradi. Hajmi bilvosita bloklarni hisobga olmaydi, lekin aslida ajratilmagan siyrak fayllardagi bloklarni hisoblaydi.

Tegishli kommunal xizmatlar

  • topmoq fayl tizimining katalog daraxtlari o'rniga oldindan yaratilgan ma'lumotlar bazasini qidiradigan Unix qidiruv vositasi. Bu nisbatan tezroq topmoq ammo unchalik aniq emas, chunki ma'lumotlar bazasi zamonaviy bo'lmasligi mumkin.
  • grep oddiy ifodaga mos keladigan satrlar uchun oddiy matnli ma'lumotlar to'plamlarini qidirish uchun buyruq qatori yordam dasturi va sukut bo'yicha mos keladigan satrlarni hisobot qilish standart chiqish.
  • daraxt - bu buyruq satrining yordamchi dasturi, kataloglar daraxtida joylashgan fayllarni rekursiv ravishda ro'yxatga olib, fayl nomlarini fayllar ierarxiyasidagi mavqeiga ko'ra indentatsiya qilish.
  • GNU Find Utility (findutils deb ham ataladi) bu a GNU to'plami bu vositalarni amalga oshirishni o'z ichiga oladi topmoq va xargs.
  • BusyBox - bu juda cheklangan resurslarga ega bo'lgan operatsion tizimlar uchun mo'ljallangan, bitta bajariladigan faylda bir nechta echib tashlangan Unix vositalarini ta'minlovchi yordamchi dastur. Bundan tashqari, ning versiyasini taqdim etadi topmoq.
  • dir fayllar yoki kataloglarni rekursiv ravishda qidiradigan / s variantiga ega.
  • Bell Labs-dan 9-reja almashtirish uchun ikkita yordam dasturidan foydalanadi topmoq: a yurish faqat daraxtda yuradigan va ismlarni bosib chiqaradigan va a sor iboralarni qobiq skript shaklida baholash orqali faqat filtrlaydigan (grep kabi). Quvurlar orqali o'zboshimchalik bilan filtrlardan foydalanish mumkin. Buyruqlar qismi emas User Space-dan 9-reja, shuning uchun Google Benjamin Barenblat-da GitHub orqali mavjud bo'lgan POSIX tizimlariga ko'chirilgan versiyasi mavjud.[8]
  • fd uchun oddiy alternativ topmoq da yozilgan Rust dasturlash tili.[9]

Shuningdek qarang

Adabiyotlar

  1. ^ "find (1) - Linux uchun qo'llanma sahifasi". man7.org. Olingan 2019-11-19.
  2. ^ Makilroy, M. D. (1987). Unix-ning tadqiqotchi o'quvchisi: Dasturchi qo'llanmasidan izohli parchalar, 1971-1986 (PDF) (Texnik hisobot). CSTR. Bell laboratoriyalari. 139.
  3. ^ "libarchiv / libarxiv". GitHub. Olingan 2015-10-04.
  4. ^ Fayllarni qidirish
  5. ^ IBM. "IBM System i Version 7.2 Programming Qshell" (PDF). Olingan 2020-09-05.
  6. ^ topmoq: fayllarni topish - Buyruqlar va yordam dasturlari, Yagona UNIX spetsifikatsiyasi, 7-son Ochiq guruh
  7. ^ a b topish (1) – FreeBSD Umumiy buyruqlar Qo'lda
  8. ^ "google / walk: find (1) o'rnini bosadigan 9 uslubidagi yordam dasturlarini rejalashtiring" ". GitHub. Olingan 30 mart 2020.
  9. ^ Piter, Devid (2020 yil 30 mart). "sharkdp / fd:" topishga "sodda, tezkor va qulay alternativ'". GitHub.

Tashqi havolalar