Î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:
- Extensia fișierului este necunoscută
- Numele exact (adică litere mari, cifre etc.) este necunoscut
- locația fișierului este necunoscută
Comentarii
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
să 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 𝗄
, 𝚔
, 𝘬
, ᵏ
, ₖ
, K
, k
ș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].*"
Book1
și se află într-un director pe care îl puteți citi, apoifind / -iname book1
îl va găsi. Sigur sunteți de faptBook1
și nuBook1.xyz
?find
șilocate
.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 înls
. Probabil că vrei să spuiiname '*book1*'
. Rețineți că modelul trebuie să fie în ghilimele pentru a opri shell-ul să-l extindă înainte cafind
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.