Yritän etsiä tiedostoa nimeltä Kirja1 .
Testissäni yritän etsiä edellä mainittua tiedostoa, ja tässä testissä en tiedä tiedoston sijaintia.
Yritin find / -iname book1
, mutta tulostetta ei ole.
Kuinka löydän tiedostoni nimeltä book1 komentorivillä, jos en tiedä missä tiedosto sijaitsee?
MUOKKAA:
Oma skenaario on kuvattu tarkemmin alla:
- Tiedostotunnistetta ei tunneta
- Tarkkaa nimeä (esim. isoja kirjaimia, numeroita jne.) ei tunneta
- tiedoston sijaintia ei tunneta
Kommentit
Vastaa
Ensinnäkin argumentti -iname
on kuori malli . Voit lukea lisää malleista Bash-käsikirjasta . Ydin on, että jotta find
todella löytää tiedoston, tiedostonimen on vastattava määritettyä mallia. Jotta isot ja pienet merkkijonot book1
vastaavat Book1.gnumeric
, sinun on joko lisättävä *
se näyttää tältä:
find / -iname "book1*"
tai määritä koko nimi:
find / -iname "Book1.gnumeric"
Toinen , -iname
tekee find
ohittamaan tiedostonimen, joten jos määrität -iname book1
, se saattaa myös etsi Book1
, bOok1
jne. Jos olet varma, että etsimäsi tiedosto on nimeltään Book1.gnumeric
älä sitten käytä -iname
mutta -name
, se on nopeampi:
find / -name "Book1.gnumeric"
Kolmanneksi, muista mainita mallin lainaaminen muun vastauksen mukaisesti.
Ja viimeinen – ovat oletko varma, että haluat etsiä tiedostoa kaikkialta järjestelmästäsi? On mahdollista, että etsimäsi tiedosto on itse asiassa $HOME
hakemisto, jos olet työskennellyt siinä tai ladannut sen jostain. Jälleen, tämä voi olla paljon nopeampi.
MUOKKAA :
Huomasin että muokkait kysymystäsi. Jos et tiedä koko tiedostonimeä, isoja kirjaimia ja sijaintia, sinun tulisi käyttää jotain tällaista:
find / -iname "book1*"
Ehdotan myös 2>/dev/null
rivin lopussa piilottaaksesi kaikki *permission denied*
ja muut virheet, joita esiintyy, jos find
kutsutaan nimellä ei-root-käyttäjä:
find / -iname "book1*" 2>/dev/null
Ja jos olet varma, että etsit yhtä tiedostoa, ja tiedostossasi on vain yksi tiedosto Järjestelmä, joka täyttää ehdot, voit pyytää find
poistumaan ensimmäisen vastaavan tiedoston löytämisen jälkeen:
find / -iname "book1*" -print -quit 2>/dev/null
kommentit
Vastaa
Voit kokeilla komentoa locate
. Se käyttää tiedostojen tietokantaa nopeuttaa hakua.
Voit etsiä kaikkia tiedostoja, jotka vastaavat *book1*
, ja jättää kirjaimet huomioimatta, voit käyttää
locate -i book1
jos haluat etsiä tiedostoja alkaen merkinnällä book1
, sinun on tehtävä jokerimerkki itse:
locate -i "book1*"
Se on paljon nopeampi kuin find
, mutta on vain yhtä ajan tasalla kuin viimeinen kerta, kun tietokanta päivitettiin.
Kommentit
- Mikään näistä ei tuottanut minulle mitään tulosta:
locate -i after.sh
,sudo locate -i "after.sh"
,sudo locate -i after.sh
,sudo locate -i '*after.sh'
Vastaa
Jos tiedät, että sinulla on tiedosto nimeltä book1.something
, jossa tiedoston sijainti, something
tarkka arvo , ja tiedostonimen isojen kirjainten mallia ei tunneta:
find / -iname "book1.*"
Jos tiedät varmasti, että tiedostonimi sisältää sanan , voit luoda todennäköisesti paljon suuremman luettelon
find / -iname "*book*"
Argumentilla -name
on kuoripallomalli. Vertaa hakemistossa, jossa tiedosto on:
$ ls Book1 ls: cannot access "Book1": No such file or directory $ ls Book1.* Book1.gnumeric
Tämä edustaa sellaista hakua, jonka -name
suorittaa. -iname
-vaihtoehto sallii yksinkertaisesti ison ja pienen kirjainkoon.
Vastaa
POSIXly,
LC_ALL=C find / -name "*[bB][oO][oO][kK]1*"
Ilmoittaa kaikkien tiedostojen polun, joiden nimi sisältää book1
(kaikilla muutoksilla pienillä ja pienillä kirjaimilla) , mutta vain ASCII-latinalaiset merkit bokBOK
, ei monia muita Unicode-muunnelmia kuten 𝗄
, 𝚔
, 𝘬
, ᵏ
, ₖ
, K
, k
ja kaikki niiden muunnelmat diakritikoilla …) kaikissa hakemistoissa, joihin olet lukenut.
Vastaa
Zsh: llä voit käyttää globaaleja kuvioita, joten tämä toimii myös:
ls -a /**/book1
Tämä etsi kaikki paikat, joissa book1
-niminen tiedosto asuu.
Testauksessani tämä näyttää olevan nopeampi kuin find
, ja se tuottaa myös vähän tai ei lainkaan käyttäjän käyttöoikeusvirheitä suoritettaessa ilman pääkäyttäjän oikeuksia
Katso manuaalinen .
Vastaa
Tämän tyyppisiin tehtäviin teen aina: find / -iregex ".*Book1.*"
Tämä lomake huolehtii skenaariosi kolmesta pisteestä (iregex
on pienet ja pienet kirjaimet järkevä lauseke, ja kuvio .*
molemmilla puolilla sopisi mihin tahansa merkkiin ennen ja jälkeen kiinteän Book1-mallin – tämä voi tietysti antaa sinulle enemmän tuloksia kuin tarvitaan, mutta et varmasti menetä tiedostoa)
Tärkein ero: jos mahdollista, ole rajoittavampi kuin vain käyttää /
, kuten kokeilla vain /home
tai niin, muuten laskeudut joihinkin hakemistoihin, jotka eivät ole merkityksellisiä (/sys
, /dev
jne. …)
Muista kuitenkin, että Unix permissi on voimassa: jos tiedosto on hakemistossa, johon find
-komentoa käyttävällä käyttäjällä ei ole pääsyä (suorita), find
et löydä sitä sieltä.
Kommentit
- iregex voitti ’ ei toimi esimerkiksi Solaris (käyttöjärjestelmää ei määritetty) (ja mahdollisesti * BSD), se on GNU-laajennus eikä ole osa standardia
find
vastaus
hopeahaku on erittäin nopea ja kätevä apu tiedostojen ja sisällön hakemiseen.
Ongelman ratkaisemiseksi hopeahakukomento näyttäisi tältä …
ag -g Book1
-g PATTERN
Tulosta mallin mukaiset tiedostonimet
Vastaa
locate
ja sen muunnelmat ovat yleensä nopea menetelmä.
# 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
Jos etsi ei ole avai Voit käyttää sen sijaan find
. Se on yleensä paljon hitaampi, mutta myös paljon tarkempi.
Jos sinulla on yksi osio: (suorita pääkäyttäjänä, jos käyttäjällä ei ehkä ole pääsyä tiedostoon)
$ 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
Jos et sisällytä -xdev
find
etsii asioita muilta osioilta, kuten /proc
ja /sys
, jotka yleensä täyttävät näytön virheillä, varsinkin jos et ole root.(Virheet voidaan piilottaa liittämällä 2> /dev/null
hakukomennon loppuun (kommentti on poistettava))
Jos sinulla on useita osioita ja et ” Kun tiedät, missä tiedostossa on, saat luettelon lsblk
(Linux-käyttöjärjestelmissä df
-lähtö on muuten vaihtoehto) ja syötä se hakuun: (root uudelleen, jos et tiedä, onko sinulla pääsyä tiedostoon)
$ 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.
(Tämä on vähän hauras, jos jossakin liittämispisteessäsi on välilyöntejä) (df
-parametrit saattavat tarvita viritystä. -P saa GNU: n df
antamaan POSIX-vakiolähdön. Muu versioilla voi olla muita parametreja tai ne voidaan jättää pois. Lue man-sivusi)
grep -F
sulkee pois muut palautetut asiat, kuten swap-osiot.
Muissa kuin GNU-versioissa awk etsi laitteita, joiden kiinnitys alkaa /dev
saadaksesi oikeat tiedostojärjestelmät ja tulostaaksesi sitten viimeisen kielen d (kiinnityspiste) df
-ulostulosta.
Tämä edellyttää myös bourne-tyyppistä kuorta (ksh
ja bash
pitäisi toimia. Jos käytät csh
-vaihtoehtoa, käynnistä komentosarja (ennen kuin yrität tätä)
Kommentit
-
grep
s saattavat olla hieman meluisia, opi suodattamaan se paremmin (tätä ei tarvita esimerkissä, mutta jos etsit jotain yleisempää, greps tarvitsisi virityksen pitääkseen melutasot alhaisena)
Vastaa
ag (hopeahaku) tarjoaa erittäin nopean haun tiedostoista, ja sillä on myös mahdollisuus etsiä tiedostonimeä:
>: 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
Joten käyttötapauksessa tässä se on> 30 kertaa nopeampi, jos tiedosto ei ole ag: n ohittama tiedosto.
Vastaa
find / -type f -iname "book[0-9].*"
Book1
, ja se on hakemistossa, jonka voit lukea, sittenfind / -iname book1
löytää sen. Oletko varma, että se on oikeastaanBook1
eikäBook1.xyz
?find
jalocate
.locate
on antelias ja löytää kaiken sopivan, kunhan se on tietokannassaan, jota päivitetään yleensä päivittäin.find
etsii tässä tapauksessa tiedostopäällystettä, sellaista mallia, jota käytettäisi kohdassals
. Tarkoitat todennäköisestiiname '*book1*'
. Huomaa, että kuvion on oltava lainausmerkeissä, jotta kuori ei pääse laajentamaan sitä ennen kuinfind
näkee sen. Huomaa myös, ettäfind
, kuten monet * nix -komennot, on turhauttavasti hiljaa, kun se epäonnistuu.