Tiedoston löytäminen mistä tahansa hakemistosta

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:

  1. Tiedostotunnistetta ei tunneta
  2. Tarkkaa nimeä (esim. isoja kirjaimia, numeroita jne.) ei tunneta
  3. tiedoston sijaintia ei tunneta

Kommentit

  • Jos on tiedosto nimeltä Book1, ja se on hakemistossa, jonka voit lukea, sitten find / -iname book1 löytää sen. Oletko varma, että se on oikeastaan Book1 eikä Book1.xyz?
  • Tiedoston koko nimi on Book1. gnumeerinen. Tarkoitatko, että minun on määritettävä tiedoston koko nimi? Jostain syystä ajattelin tälle nimenomaiselle komennolle, että tarvitsen vain tiedoston yleisen nimen ’. Testini yrittää löytää tiedostoa, jos esimerkiksi en ’ muista tiedostotunnistetta ja tiedän vain tiedoston nimen I ’ etsin. Ole hyvä ja neuvoo.
  • @don_crissti Valmis. Katso yllä oleva muokkaus.
  • Olet sekoittamassa find ja locate. 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 kohdassa ls. Tarkoitat todennäköisesti iname '*book1*'. Huomaa, että kuvion on oltava lainausmerkeissä, jotta kuori ei pääse laajentamaan sitä ennen kuin find näkee sen. Huomaa myös, että find, kuten monet * nix -komennot, on turhauttavasti hiljaa, kun se epäonnistuu.

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 𝗄, 𝚔, 𝘬, , , , 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].*" 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *