Ich versuche, nach einer Datei mit dem Namen Book1 .
In meinem Test versuche ich, nach der oben genannten Datei zu suchen, und in diesem Test weiß ich nicht, wo sich diese Datei befindet.
Ich habe find / -iname book1
versucht, aber es gibt keine Ausgabe.
Wie finde ich meine Datei mit dem Namen book1 über die Befehlszeile, wenn ich es nicht weiß Wo befindet sich die Datei?
BEARBEITEN:
Mein Szenario wird beschrieben Im Folgenden näher beschrieben:
- Die Dateierweiterung ist unbekannt.
- Der genaue Name (dh Großbuchstaben, Zahlen usw.) ist unbekannt Speicherort der Datei ist unbekannt
Kommentare
- Wenn eine Datei mit dem Namen
Book1
und es befindet sich in einem Verzeichnis, das Sie lesen können, dann wirdfind / -iname book1
es finden. Sind Sie sicher, dass es sich tatsächlich umBook1
handelt und nicht umBook1.xyz
? - Der vollständige Name der Datei lautet Book1. gnumerisch. Wollen Sie damit sagen, dass ich den gesamten Namen der Datei angeben muss? Aus irgendeinem Grund dachte ich für diesen speziellen Befehl, dass alles, was ich ‚ brauche, der allgemeine Name der Datei ist. Mein Test versucht, eine Datei zu finden, wenn ich mich beispielsweise ‚ nicht an die Dateierweiterung erinnere und nur den Namen der Datei kenne, die ich ‚ Ich suche. Bitte geben Sie Bescheid.
- @don_crissti Fertig. Siehe oben Bearbeiten.
- Sie mischen
find
undlocate
.locate
ist großzügig und findet alles, was passt, solange es sich in seiner Datenbank befindet, die normalerweise täglich aktualisiert wird.find
sucht in diesem Fall nach einem Dateiglob, dem Muster, das Sie inls
verwenden würden. Sie meinen wahrscheinlichiname '*book1*'
. Beachten Sie, dass sich das Muster in Anführungszeichen befinden muss, damit die Shell es nicht erweitern kann, bevorfind
es sehen kann. Beachten Sie auch, dassfind
wie viele * nix-Befehle frustrierend leise ist, wenn es nicht erfolgreich ist.
Antwort
Zunächst ist ein Argument für -iname
ein Shell-Muster . Weitere Informationen zu Mustern finden Sie im Bash-Handbuch . Das Wesentliche ist, dass der Dateiname mit dem angegebenen Muster übereinstimmen muss, damit find
tatsächlich eine Datei findet . Um eine Zeichenfolge book1
mit Book1.gnumeric
in Übereinstimmung zu bringen, müssen Sie entweder *
hinzufügen es sieht folgendermaßen aus:
find / -iname "book1*"
oder geben Sie den vollständigen Namen an:
find / -iname "Book1.gnumeric"
Zweitens , -iname
lässt find
den Dateinamenfall ignorieren. Wenn Sie also -iname book1
angeben, kann dies auch der Fall sein Suchen Sie nach Book1
, bOok1
usw. Wenn Sie sicher sind, dass die gesuchte Datei Book1.gnumeric
Verwenden Sie dann nicht -iname
, sondern -name
, es wird schneller:
find / -name "Book1.gnumeric"
Drittens, denken Sie daran, das Muster wie in der anderen Antwort angegeben zu zitieren.
Und zuletzt – sind Sind Sie sicher, dass Sie die Datei überall auf Ihrem System suchen möchten? Möglicherweise befindet sich die gesuchte Datei tatsächlich in Ihrer $HOME
Verzeichnis, wenn Sie daran gearbeitet oder es von irgendwoher heruntergeladen haben. Auch dies kann viel schneller sein.
BEARBEITEN :
Ich habe es bemerkt dass Sie Ihre Frage bearbeitet haben. Wenn Sie den vollständigen Dateinamen, die Groß- und Kleinschreibung und den Speicherort nicht kennen, sollten Sie Folgendes verwenden:
find / -iname "book1*"
Ich schlage auch vor, am Ende der Zeile, um alle *permission denied*
und andere Fehler auszublenden, die auftreten, wenn Sie find
als aufrufen Ein Benutzer ohne Rootberechtigung:
find / -iname "book1*" 2>/dev/null
Und wenn Sie sicher sind, dass Sie nach einer einzelnen Datei suchen und sich nur eine einzige Datei auf Ihrer befindet System, das den Kriterien entspricht, können Sie find
anweisen, nach dem Auffinden der ersten übereinstimmenden Datei zu beenden:
find / -iname "book1*" -print -quit 2>/dev/null
Kommentare
/ ul>
Antwort
Sie können den Befehl locate
verwenden. Er verwendet eine Datenbank mit Dateinamen um die Suche zu beschleunigen.
Um nach allen Dateien zu suchen, die mit *book1*
übereinstimmen, und Groß- und Kleinschreibung zu ignorieren, können Sie
locate -i book1
book1
beginnen, müssen Sie den Platzhalter selbst erstellen:
locate -i "book1*"
Es ist viel schneller als find
, aber nur so aktuell wie beim letzten Aktualisieren der Datenbank.
Kommentare
- Keine dieser Angaben hat für mich eine Ausgabe erzeugt:
locate -i after.sh
,sudo locate -i "after.sh"
,sudo locate -i after.sh
,sudo locate -i '*after.sh'
Antwort
Wenn Sie wissen, dass Sie eine Datei mit dem Namen book1.something
haben, wobei der Speicherort der Datei der genaue Wert von something
ist und das Großschreibmuster des Dateinamens sind alle unbekannt:
find / -iname "book1.*"
Wenn Sie nur sicher wissen, dass der Dateiname das Wort können Sie mit
find / -iname "*book*"
das Argument für -name
ist ein Shell-Glob-Muster. Vergleichen Sie aus dem Verzeichnis, in dem sich die Datei befindet, Folgendes:
$ ls Book1 ls: cannot access "Book1": No such file or directory $ ls Book1.* Book1.gnumeric
Dies ist die Art der Suche, die von -name
durchgeführt wird. Die Option -iname
ermöglicht einfach eine Version, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird.
Antwort
POSIXly,
LC_ALL=C find / -name "*[bB][oO][oO][kK]1*"
Gibt den Pfad aller Dateien an, deren Name book1
enthält (bei jeder Falländerung) , aber nur unter Berücksichtigung der lateinischen ASCII-Zeichen bokBOK
, nicht der vielen anderen Unicode-Variationen wie 𝗄
, 𝚔
, 𝘬
, ᵏ
, ₖ
, K
, k
und alle ihre Variationen mit diakritischen Zeichen …) in allen Verzeichnissen, auf die Sie Lesezugriff haben.
Antwort
Mit Zsh können Sie Glob-Muster verwenden, daher funktioniert dies auch:
ls -a /**/book1
Dies wird Finden Sie alle Speicherorte, an denen eine Datei mit dem Namen book1
lebt.
In meinen Tests scheint dies schneller zu sein als mit find
und es werden auch nur geringe bis keine Benutzerberechtigungsfehler erzeugt, wenn sie ohne Root-Berechtigung ausgeführt werden.
Siehe Handbuch .
Antwort
Für diese Art von Aufgaben mache ich immer: find / -iregex ".*Book1.*"
Dieses Formular würde sich um die 3 Punkte Ihres Szenarios kümmern (iregex
ist ein rationaler Ausdruck ohne Berücksichtigung der Groß- und Kleinschreibung und das Muster mit .*
auf beiden Seiten würde mit jedem Zeichen vor und nach Ihrem festen Muster von Book1 übereinstimmen – dies könnte Ihnen offensichtlich mehr Ergebnisse als nötig zurückgeben, aber Sie werden die Datei sicher nicht verpassen)
Der Hauptunterschied: Wenn möglich, seien Sie restriktiver als nur die Verwendung von /
, wie wenn Sie nur /home
oder so versuchen Sie werden in einige Verzeichnisse absteigen, die nicht relevant sind (/sys
, /dev
usw.).
Denken Sie jedoch daran Unix permissi Es gilt Folgendes: Wenn sich die Datei in einem Verzeichnis befindet, für das der Benutzer, der den Befehl find
ausführt, kein Zugriffsrecht (Ausführungsrecht) hat, wird find
dies tun kann es dort nicht finden.
Kommentare
- iregex funktioniert ‚ nicht an Orten wie Solaris (Betriebssystem wurde nicht angegeben) (und möglicherweise * BSD) ist eine GNU-Erweiterung und nicht Teil des -Standards
find
Antwort
Silver Searcher ist ein sehr schnelles und praktisches Dienstprogramm zum Suchen nach Dateien und Inhalten.
Um Ihr Problem zu lösen, würde der Befehl Silver Searcher folgendermaßen aussehen …
ag -g Book1
-g PATTERN
Dateinamen drucken, die mit MUSTER übereinstimmen
Antwort
locate
und seine Varianten sind in der Regel eine schnelle 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
Wenn suchen ist nicht avai Sie können stattdessen find
verwenden. Es ist in der Regel viel langsamer, aber auch viel präziser.
Wenn Sie eine einzelne Partition haben: (Als Root ausführen, wenn Ihr Benutzer möglicherweise keinen Zugriff auf die Datei hat)
$ 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
Wenn Sie -xdev
find
nicht einschließen, werden Dinge auf anderen Partitionen wie /proc
und /sys
, die dazu neigen, Ihren Bildschirm mit Fehlern zu überfluten, insbesondere wenn Sie kein Root sind.(Fehler können ausgeblendet werden, indem 2> /dev/null
am Ende des Befehls find angehängt wird (der Kommentar sollte entfernt werden))
Wenn Sie mehrere Partitionen haben und nicht “ Wenn Sie nicht wissen, auf welcher Datei sich die Datei befindet, können Sie eine Liste mit lsblk
abrufen (unter Linux-basierten Betriebssystemen wird die Ausgabe von df
analysiert eine andere Option) und geben Sie diese in find ein: (root erneut, wenn Sie nicht wissen, ob Sie auf die Datei zugreifen können)
$ 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.
(Dies ist ein bisschen zerbrechlich, wenn einer Ihrer Mountpunkte Leerzeichen enthält) (df
Parameter müssen möglicherweise angepasst werden. -P bewirkt, dass GNU df
die Standard-POSIX-Ausgabe liefert Versionen haben möglicherweise andere Parameter oder müssen weggelassen werden. Lesen Sie Ihre Manpage.
Die grep -F
schließt andere zurückgegebene Elemente aus, z. B. Swap-Partitionen.
In der Nicht-GNU-Version findet awk Geräte mit einem Mount, der mit /dev
beginnt, um echte Dateisysteme zu erhalten und dann das letzte Feld zu drucken d (der Mountpunkt) aus der Ausgabe df
.
Dies setzt auch eine bourneähnliche Shell voraus (ksh
und bash
sollte funktionieren. Wenn Sie eine csh
-Variante verwenden, starten Sie eine skriptfähige Shell , bevor Sie dies versuchen)
Kommentare
- Die
grep
s sind möglicherweise etwas laut, Erfahren Sie, wie Sie es filtern können besser (dies sollte im Beispiel nicht benötigt werden, aber wenn es etwas häufigeres ist, nach dem gesucht wird, die Greps würde eine Abstimmung benötigen, um den Geräuschpegel niedrig zu halten)
Antwort
ag (der silberne Sucher) bietet eine sehr schnelle Suche in Dateien und bietet auch die Möglichkeit, nach Dateinamen zu suchen:
>: 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
Also In meinem Anwendungsfall ist es hier> 30-mal schneller, wenn die Datei keine von ag ignorierte Datei ist.
Antwort
find / -type f -iname "book[0-9].*"