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:
- De bestandsextensie is onbekend
- De exacte naam (dwz hoofdletters, cijfers, enz.) is onbekend
- De locatie van het bestand is onbekend
Reacties
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
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 𝗄
, 𝚔
, 𝘬
, ᵏ
, ₖ
, K
, k
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].*"
Book1
, en het staat in een directory die je kunt lezen, dan zalfind / -iname book1
het vinden. Weet u zeker dat het in werkelijkheidBook1
is en nietBook1.xyz
?find
enlocate
.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 inls
. U bedoelt waarschijnlijkiname '*book1*'
. Merk op dat het patroon tussen aanhalingstekens moet staan om te voorkomen dat de shell het uitbreidt voordatfind
het te zien krijgt. Merk ook op datfind
, zoals veel * nix-opdrachten, frustrerend stil is als het niet lukt.