So finden Sie eine Datei aus einem beliebigen Verzeichnis

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:

  1. Die Dateierweiterung ist unbekannt.
  2. 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 wird find / -iname book1 es finden. Sind Sie sicher, dass es sich tatsächlich um Book1 handelt und nicht um Book1.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 und locate. 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 in ls verwenden würden. Sie meinen wahrscheinlich iname '*book1*'. Beachten Sie, dass sich das Muster in Anführungszeichen befinden muss, damit die Shell es nicht erweitern kann, bevor find es sehen kann. Beachten Sie auch, dass find 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 

Wenn Sie nach Dateien suchen möchten, die mit 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 𝗄, 𝚔, 𝘬, , , , 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].*" 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.