Hoe vind ik een bestand uit een willekeurige directory

Ik “probeer te zoeken naar een bestand met de naam Book1 .

In mijn test probeer ik naar het bovengenoemde bestand te zoeken en in deze test weet ik niet waar dat bestand zich bevindt.

Ik heb find / -iname book1 geprobeerd, maar er is geen uitvoer.

Hoe vind ik mijn bestand met de naam book1 via de opdrachtregel als ik het niet weet waar het bestand zich bevindt?

EDIT:

Mijn scenario wordt beschreven hieronder in meer detail:

  1. De bestandsextensie is onbekend
  2. De exacte naam (dwz hoofdletters, cijfers, enz.) is onbekend
  3. De locatie van het bestand is onbekend

Reacties

  • Als er een bestand is met de naam Book1, en het staat in een directory die je kunt lezen, dan zal find / -iname book1 het vinden. Weet u zeker dat het in werkelijkheid Book1 is en niet Book1.xyz?
  • De volledige naam van het bestand is Boek1. gnumeriek. Bedoel je dat ik de volledige naam van het bestand moet specificeren? Om de een of andere reden dacht ik, voor dit specifieke commando, dat ik ‘ alleen de algemene naam van het bestand nodig heb. Mijn test probeert een bestand te vinden als ik bijvoorbeeld ‘ de bestandsextensie niet kan onthouden en alleen de naam van het bestand weet ik ‘ m zoek. Gelieve te adviseren.
  • @don_crissti Klaar. Zie hierboven Bewerken.
  • Je mixt find en locate. locate is genereus en zal alles vinden dat overeenkomt, zolang het in de database staat, die normaal dagelijks wordt bijgewerkt. find zoekt in dit geval naar een bestand glob, het soort patroon dat je zou gebruiken in ls. U bedoelt waarschijnlijk iname '*book1*'. Merk op dat het patroon tussen aanhalingstekens moet staan om te voorkomen dat de shell het uitbreidt voordat find het te zien krijgt. Merk ook op dat find, zoals veel * nix-opdrachten, frustrerend stil is als het niet lukt.

Antwoord

Ten eerste is een argument voor -iname een shell patroon . U kunt meer over patronen lezen in de Bash-handleiding . De kern is dat, wil find daadwerkelijk een bestand vinden vinden, de bestandsnaam moet overeenkomen met het opgegeven patroon. Om een hoofdletterongevoelige tekenreeks book1 overeen te laten komen met Book1.gnumeric, moet u ofwel * toevoegen het ziet er als volgt uit:

find / -iname "book1*" 

of specificeer de volledige naam:

find / -iname "Book1.gnumeric" 

Tweede , -iname zorgt ervoor dat find het hoofdlettergebruik van de bestandsnaam negeert, dus als u -iname book1 opgeeft, kan dit ook vind Book1, bOok1 enz. Als u “zeker weet dat het bestand dat u” zoekt Book1.gnumeric gebruik dan geen -iname maar -name, het zal sneller zijn:

find / -name "Book1.gnumeric" 

Ten derde, onthoud dat u het patroon citeert zoals vermeld in het ander antwoord .

En als laatste – zijn weet je zeker dat je het bestand overal op je systeem wilt zoeken? Het is mogelijk dat het bestand dat je zoekt daadwerkelijk in je $HOME directory als je daaraan hebt gewerkt of het ergens hebt gedownload. Nogmaals, dat kan veel sneller zijn.

EDIT :

Ik heb gemerkt dat u uw vraag heeft aangepast. Als je de volledige bestandsnaam, hoofdlettergebruik en locatie niet weet, zou je zoiets als dit moeten gebruiken:

find / -iname "book1*" 

Ik raad ook aan om 2>/dev/null aan het einde van de regel om alle *permission denied* en andere fouten te verbergen die aanwezig zullen zijn als je find aanroept als een niet-rootgebruiker:

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

En als u “zeker weet dat u” op zoek bent naar een enkel bestand en er slechts een enkel bestand op uw systeem dat aan de criteria voldoet, kunt u find vertellen om af te sluiten nadat u het eerste overeenkomende bestand hebt gevonden:

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

Opmerkingen

Answer

Je kunt het locate commando proberen. Het gebruikt een database met bestandsnamen om het zoeken sneller te maken.

Om te zoeken naar alle overeenkomende bestanden *book1*, en hoofdlettergebruik te negeren, zou je

locate -i book1 

als je wilt zoeken naar bestanden beginnend met book1, moet je het jokerteken zelf doen:

locate -i "book1*" 

Het is veel sneller dan find, maar is slechts zo up-to-date als de laatste keer dat de database werd vernieuwd.

Opmerkingen

  • Geen van deze leverde voor mij enige output op: locate -i after.sh, sudo locate -i "after.sh", sudo locate -i after.sh, sudo locate -i '*after.sh'

Antwoord

Als je weet dat je een bestand hebt met de naam book1.something, waarbij de bestandslocatie de exacte waarde is van something , en het hoofdletterpatroon van de bestandsnaam zijn allemaal onbekend:

find / -iname "book1.*" 

Als u alleen zeker weet dat de bestandsnaam het woord , u kunt waarschijnlijk een veel grotere lijst genereren met

find / -iname "*book*" 

Het argument voor -name is een shell glob-patroon. Vergelijk vanuit de directory waarin het bestand zich bevindt:

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

Dit vertegenwoordigt het soort zoekopdracht dat wordt uitgevoerd door -name. De -iname optie staat gewoon een niet hoofdlettergevoelige versie hiervan toe.

Antwoord

POSIXly,

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

Rapporteert het pad van alle bestanden waarvan de naam book1 bevat (met elke variant van hoofdlettergebruik , maar alleen rekening houdend met de ASCII Latijnse tekens bokBOK, niet de vele andere variaties in Unicode zoals 𝗄, 𝚔, 𝘬, , , , en al hun variaties met diakritische tekens …) in alle mappen waartoe u leestoegang heeft.

Antwoord

Met Zsh kun je glob-patronen gebruiken, dus dit werkt ook:

ls -a /**/book1 

Dit zal vind alle locaties waar een bestand met de naam book1 woont.

In mijn testen lijkt dit sneller te zijn dan het gebruik van find, en het produceert ook weinig tot geen gebruikersmachtigingsfouten wanneer het wordt uitgevoerd zonder rootmachtiging

Zie manual .

Answer

Voor dit soort taken doe ik altijd: find / -iregex ".*Book1.*"

Dit formulier zorgt voor de 3 punten van uw scenario (iregex is een hoofdletterongevoelige rationele uitdrukking, en het patroon met .* aan beide zijden komt overeen met elk teken voor en na uw vaste patroon van Boek1 – dit kan u uiteraard meer resultaten opleveren dan nodig is, maar u zult het bestand zeker niet missen)

Het belangrijkste verschil: wees indien mogelijk beperkter dan alleen / te gebruiken, zoals alleen /home of zo, anders u zult in sommige mappen afdalen die niet relevant zijn (/sys, /dev, enz …)

Onthoud echter dat Unix permissi ons zijn van toepassing: als het bestand zich in een map bevindt waarvoor de gebruiker die de opdracht find uitvoert, geen toegangsrechten (uitvoeren) heeft, zal find kan het daar niet vinden.

Reacties

  • iregex won ‘ t werken op plaatsen zoals Solaris (OS was niet gespecificeerd) (en mogelijk * BSD), het is een GNU-extensie en maakt geen deel uit van de standaard find

Antwoord

Silver Searcher is een zeer snelle en handige tool om naar bestanden en inhoud te zoeken.

Om uw probleem op te lossen zou het silver searcher-commando er als volgt uitzien …

ag -g Book1

-g PATTERN Druk bestandsnamen af die overeenkomen met PATTERN

Antwoord

locate en zijn varianten zijn doorgaans een snelle methode.

# 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 

Indien is niet beschikbaar label, kunt u in plaats daarvan find gebruiken. Het is meestal veel langzamer, maar ook veel nauwkeuriger.

Als je een enkele partitie hebt: (draai als root als je gebruiker misschien geen toegang heeft tot het bestand)

$ 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 

Als u -xdev find niet opneemt, zoekt u dingen op andere partities, zoals /proc en /sys, die de neiging hebben om uw scherm te overspoelen met fouten, vooral als u geen root bent.(Fouten kunnen worden verborgen door 2> /dev/null toe te voegen aan het einde van het zoekcommando (de opmerking moet worden verwijderd))

Als je meerdere partities hebt en je ” weet op welke het bestand zich bevindt, je kunt een lijst krijgen met lsblk (op Linux-gebaseerde besturingssystemen, parseren van df uitvoer is een andere optie) en voer dat in find: (nogmaals root als je niet weet of je het bestand kunt openen)

$ 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. 

(Dit is een beetje fragiel als een van je mountpoints spaties bevat in) (df parameters moeten mogelijk worden aangepast. -P zorgt ervoor dat GNU df standaard POSIX-uitvoer geeft. versies kunnen andere parameters hebben of moeten worden weggelaten. Lees je man-pagina)

De grep -F sluit andere dingen uit die worden geretourneerd, zoals swappartities.

In de niet-GNU-versie, awk vind apparaten met een mount die begint met /dev om echte bestandssystemen te krijgen en druk vervolgens het laatste bestand af d (het mountpoint) van de df uitvoer.

Dit veronderstelt ook een bourne-achtige shell (ksh en bash zou moeten werken. Als je een csh variant gebruikt, start dan een scriptbare shell voordat je dit probeert)

Reacties

  • De grep s kunnen een beetje luidruchtig zijn, leer hoe u het filtert beter (dit zou niet nodig moeten zijn bij het voorbeeld, maar als het iets gebruikelijker is waarnaar wordt gezocht, kunnen de greps zou afstemming nodig hebben om het geluidsniveau laag te houden)

Antwoord

ag (de zilveren zoeker) biedt zeer snel zoeken in bestanden, en heeft ook een optie om naar bestandsnaam te zoeken:

>: 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 

Dus in mijn geval hier is het> 30 keer sneller als het bestand geen bestand is dat genegeerd wordt door ag.

Antwoord

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *