Cum se găsește un fișier din orice director

Încerc să caut un fișier numit Book1 .

În testul meu încerc să caut fișierul menționat anterior și în acest test, nu știu unde se află fișierul respectiv.

Am încercat find / -iname book1 dar nu există nicio ieșire.

Cum găsesc fișierul meu numit book1 folosind linia de comandă dacă nu știu unde se află fișierul?

EDIT:

Scenariul meu este descris mai detaliat mai jos:

  1. Extensia fișierului este necunoscută
  2. Numele exact (adică litere mari, cifre etc.) este necunoscut
  3. locația fișierului este necunoscută

Comentarii

  • Dacă există un fișier numit Book1 și se află într-un director pe care îl puteți citi, apoi find / -iname book1 îl va găsi. Sigur sunteți de fapt Book1 și nu Book1.xyz?
  • Numele complet al fișierului este Book1. gnumeric. Spuneți că trebuie să specific întregul nume al fișierului? Din anumite motive, am crezut, pentru această comandă specifică, că tot ceea ce am nevoie ‘ este numele general al fișierului. Testul meu încearcă să găsească un fișier dacă, de exemplu, nu ‘ nu-mi amintesc extensia de fișier și știu doar numele fișierului I ‘ caut. Vă rugăm să ne informați.
  • @don_crissti Gata. Consultați Editați mai sus.
  • Amestecați find și locate. locate este generos și va găsi orice se potrivește, atâta timp cât se află în baza sa de date, care este în mod normal actualizată zilnic. find, în acest caz, caută un fișier glob, tipul de model pe care l-ați folosi în ls. Probabil că vrei să spui iname '*book1*'. Rețineți că modelul trebuie să fie în ghilimele pentru a opri shell-ul să-l extindă înainte ca find să-l vadă. De asemenea, observați că find, la fel ca multe comenzi * nix, este frustrant de tăcut atunci când nu reușește.

Răspuns

Mai întâi, un argument pentru -iname este un shell model . Puteți citi mai multe despre modele în manual Bash . Esențialul este că, pentru ca find găsească un fișier, numele fișierului trebuie să se potrivească cu modelul specificat. Pentru a crea un șir care nu face distincția între majuscule și minuscule book1 se potrivește cu Book1.gnumeric trebuie să adăugați * arată astfel:

find / -iname "book1*" 

sau specifică numele complet:

find / -iname "Book1.gnumeric" 

Second , -iname va face ca find să ignore cazul numelui fișierului, deci dacă specificați -iname book1 găsiți Book1, bOok1 etc. Dacă sunteți sigur că fișierul pe care îl căutați este numit Book1.gnumeric atunci nu folosiți -iname, dar -name, va fi mai rapid:

find / -name "Book1.gnumeric" 

În al treilea rând, nu uitați să citați modelul așa cum a fost spus în alt răspuns .

Și ultimul – sunt sunteți sigur că doriți să căutați fișierul peste tot pe sistemul dvs.? Este posibil ca fișierul pe care îl căutați să fie de fapt în $HOME director dacă ați lucrat la asta sau l-ați descărcat de undeva. Din nou, acest lucru poate fi mult mai rapid.

EDIT :

Am observat că ți-ai editat întrebarea. Dacă nu cunoașteți numele complet al fișierului, scrierea cu majuscule și locația într-adevăr, ar trebui să utilizați așa ceva:

find / -iname "book1*" 

Vă sugerez, de asemenea, să puneți 2>/dev/null la sfârșitul liniei pentru a ascunde toate *permission denied* și alte erori care vor fi prezente dacă invocați find un utilizator non-root:

find / -iname "book1*" 2>/dev/null 

Și dacă sunteți sigur că sunteți în căutarea unui singur fișier și că există doar un singur fișier pe sistem care corespunde criteriilor pe care le puteți spune find să iasă după găsirea primului fișier care se potrivește:

find / -iname "book1*" -print -quit 2>/dev/null 

Comentarii

Răspuns

Puteți încerca comanda locate. Utilizează o bază de date cu nume de fișiere pentru a face căutarea mai rapidă.

Pentru a căuta toate fișierele care se potrivesc cu *book1* și ignorând majuscule, puteți utiliza

locate -i book1 

dacă doriți să căutați fișiere începând cu book1 va trebui să faceți singur caracterul comod:

locate -i "book1*" 

Este mult mai rapid decât find, dar este la fel de actualizat ca ultima dată când a fost actualizată baza de date.

Comentarii

  • Niciunul dintre acestea nu mi-a produs rezultate: locate -i after.sh, sudo locate -i "after.sh", sudo locate -i after.sh, sudo locate -i '*after.sh'

Răspuns

Dacă știți că aveți un fișier numit book1.something, unde se află locația fișierului, valoarea exactă a something , și modelul de scriere cu majuscule al numelui de fișier sunt toate necunoscute:

find / -iname "book1.*" 

Dacă tot ce știți sigur este că numele de fișier conține cuvântul , puteți genera o listă probabil mult mai mare cu

find / -iname "*book*" 

Argumentul pentru -name este un model de glob de coajă. Din directorul în care se află fișierul, comparați:

$ ls Book1 ls: cannot access "Book1": No such file or directory $ ls Book1.* Book1.gnumeric 

Aceasta reprezintă tipul de căutare efectuată de -name. Opțiunea -iname permite pur și simplu o versiune care nu face sensibilitatea la majuscule și minuscule.

Răspuns

POSIXly,

LC_ALL=C find / -name "*[bB][oO][oO][kK]1*" 

Va raporta calea tuturor fișierelor al căror nume conține book1 (cu orice variație de caz , dar numai luând în considerare caracterele latine ASCII bokBOK, nu multe alte variații în Unicode precum 𝗄, 𝚔, 𝘬, , , , și toate variantele lor cu diacritice …) în toate directoarele la care ați acces la citire.

Răspundeți

Cu Zsh puteți utiliza modele glob, deci și acest lucru funcționează:

ls -a /**/book1 

Acest lucru va găsiți toate locațiile în care trăiește un fișier numit book1.

În testarea mea, acest lucru pare a fi mai rapid decât utilizarea find și, de asemenea, produce puține sau deloc erori de permisiune a utilizatorului atunci când rulează fără permisiunea root

Consultați manual .

Răspuns

Pentru aceste tipuri de sarcini fac întotdeauna: find / -iregex ".*Book1.*"

Acest formular ar avea grijă de cele 3 puncte ale scenariului dvs. (iregex este o expresie rațională insensibilă la majuscule, iar modelul cu .* de pe ambele părți s-ar potrivi cu orice caracter înainte și după modelul dvs. fix din Book1 – acest lucru vă poate oferi în mod evident mai multe rezultate decât este necesar, dar sunteți sigur că nu ratați fișierul)

Principala diferență: dacă este posibil, fiți mai restrictivi decât simpla utilizare a /, cum ar fi încercarea numai /home sau cam așa, altfel veți coborî în unele directoare care nu sunt relevante (/sys, /dev, etc …)

Rețineți totuși că Unix permissi se aplică: dacă fișierul se află într-un director pentru care utilizatorul care execută comanda find nu are dreptul de acces (executare), find nu îl pot găsi acolo.

Comentarii

  • iregex a câștigat ‘ nu funcționează în locuri precum Solaris (sistemul de operare nu a fost specificat) (și, eventual, * BSD), este o extensie GNU și nu face parte din standard find

Răspuns

Silver Searcher este o utilizare foarte rapidă și la îndemână pentru a căuta fișiere și conținut.

Pentru a rezolva problema dvs., comanda Silver Searcher ar arăta astfel …

ag -g Book1

-g PATTERN Tipăriți numele fișierelor care se potrivesc cu MODEL

Răspundeți

locate și variantele sale tind să fie o metodă rapidă.

# updatedb # run as root, possibly using sudo, e.g. sudo -b updatedb. If file is on the system for more than a day it should already be in the index and this can be skipped $ locate -i book1 

Dacă localizați nu este avai lable, puteți utiliza find în schimb. Tinde să fie mult mai lent, dar și mult mai precis.

Dacă aveți o singură partiție: (rulați ca root dacă este posibil ca utilizatorul dvs. să nu aibă acces la fișier)

$ find / -xdev -iname "book1*" -print # If the iname extension to find is available $ find / -xdev -print | grep -F -i /book1 # if iname is not available 

Dacă nu includeți -xdev find caută lucruri pe alte partiții, cum ar fi /proc și /sys, care tind să inunde ecranul cu erori, mai ales dacă nu sunteți root.(Erorile pot fi ascunse adăugând 2> /dev/null la sfârșitul comenzii find (comentariul ar trebui eliminat))

Dacă aveți mai multe partiții și nu faceți acest lucru ” Nu știți pe care este fișierul, puteți obține o listă cu lsblk (pe sisteme de operare bazate pe Linux, analizarea df este o opțiune în caz contrar) și introduceți-l în find: (root din nou dacă nu știți dacă puteți accesa fișierul)

$ find $(lsblk -O MOUNTPOINT -n | grep -F /) -xdev -iname "book1*" -print # GNU-based OSes $ find $(df -P|awk "$1 ~ /^\/dev/ {print $NF}") -xdev | grep -F -i book1 # Non-GNU based OSes. 

(Acesta este un pic fragil dacă oricare dintre punctele dvs. de montare au spații) (parametrii df ar putea avea nevoie de reglare. -P face ca GNU df să dea ieșire POSIX standard. Altele versiunile pot avea alți parametri sau ar trebui să fie lăsate deoparte. Citiți pagina de manual)

grep -F exclude alte lucruri returnate, cum ar fi partițiile de swap. p> În versiunea non-GNU, awk găsiți dispozitive cu o montare începând cu /dev pentru a obține sisteme de fișiere reale și apoi pentru a imprima ultimul fiel d (punctul de montare) din ieșirea df.

Aceasta presupune, de asemenea, un shell de tip bourne (ksh și bash ar trebui să funcționeze. Dacă utilizați o variantă csh, porniți un shell scriptabil înainte de a încerca acest lucru)

Comentarii

  • grep s-ar putea să fie cam zgomotoase, aflați cum să o filtrați mai bine (acest lucru nu ar trebui să fie necesar cu exemplul, dar dacă este ceva mai frecvent căutat, greps ar avea nevoie de reglare pentru a menține nivelul de zgomot scăzut)

Răspuns

ag (căutătorul argintiu) oferă căutare foarte rapidă în fișiere și are, de asemenea, o opțiune de căutare a numelui fișierului:

>: time ag -g foo # uses heuristics to only look in desired locations apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg real 0m0.884s user 0m0.701s sys 0m0.178s >: time find . -name "*foo*" ./apps/ssr/dist/static/media/foo-illustration.jpg ./apps/vxy/dist/static/media/foo-illustration.jpg ./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg real 0m29.744s user 0m2.108s sys 0m13.982s >: time ag -ug foo # searching all files is still faster and simpler to use then find command apps/ssr/dist/static/media/foo-illustration.jpg apps/vxy/dist/static/media/foo-illustration.jpg apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg real 0m16.698s user 0m1.951s sys 0m7.119s 

Deci în cazul meu de utilizare aici este de 30 de ori mai rapid dacă fișierul nu este un fișier ignorat de ag.

Răspuns

find / -type f -iname "book[0-9].*" 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *