So finden Sie eine Datei aus einem beliebigen Verzeichnis

22

Ich versuche nach einer Datei namens Book1 zu suchen .

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 versucht, find / -iname book1aber es gibt keine Ausgabe.

Wie finde ich meine Datei mit dem Namen book1 über die Befehlszeile, wenn ich nicht weiß, wo sich die Datei befindet?

BEARBEITEN:

Mein Szenario wird im Folgenden genauer beschrieben:

  1. Die Dateierweiterung ist unbekannt
  2. Der genaue Name (dh Großbuchstaben, Zahlen usw.) ist unbekannt
  3. Der Speicherort der Datei ist unbekannt
Aspire27
quelle
2
Wenn eine Datei aufgerufen Book1wird und sich in einem Verzeichnis befindet, das Sie lesen können, find / -iname book1wird sie gefunden. Sind Sie sicher, dass dies tatsächlich der Fall ist Book1und nicht Book1.xyz?
Fox
Der vollständige Name der Datei lautet Book1.gnumeric. Wollen Sie damit sagen, dass ich den gesamten Namen der Datei angeben muss? Aus irgendeinem Grund dachte ich, für diesen speziellen Befehl würde ich nur den allgemeinen Namen der Datei benötigen. Mein Test versucht, eine Datei zu finden, wenn ich mich zum Beispiel nicht an die Dateierweiterung erinnere und nur den Namen der gesuchten Datei kenne. Bitte beraten.
Aspire27
@don_crissti Fertig Bitte siehe oben Bearbeiten.
Aspire27
Du mischst find und locate. locateist großzügig und findet alles, was passt, solange es sich in seiner Datenbank befindet, die normalerweise täglich aktualisiert wird. findsucht in diesem Fall nach einem Datei-Glob, der Art von Muster, in der Sie verwenden würden ls. Du meinst wahrscheinlich iname '*book1*'. Beachten Sie, dass das Muster in Anführungszeichen stehen muss, damit die Shell es nicht erweitert, bevor es findangezeigt wird. Beachten Sie auch, dass es find, wie bei vielen * nix-Befehlen, frustrierend leise ist, wenn es nicht erfolgreich ist.
Manngo

Antworten:

31

Erstens ist ein Argument für -inameein Shell- Muster . Weitere Informationen zu Mustern finden Sie im Handbuch zu Bash . Das Wesentliche ist, dass der Dateiname mit dem angegebenen Muster übereinstimmen muss , damit eine Datei findtatsächlich gefunden werden kann. Um eine Zeichenfolge zu erstellen , bei der die Groß- und Kleinschreibung nicht beachtet wird book1, müssen Book1.gnumericSie Folgendes hinzufügen *:

find / -iname 'book1*'

oder geben Sie den vollständigen Namen an:

find / -iname 'Book1.gnumeric'

Zweitens -inamewird finddie Groß- und Kleinschreibung des Dateinamens ignoriert. Wenn Sie also angeben, dass -iname book1er möglicherweise auch gefunden wird Book1, bOok1usw. Wenn Sie sicher sind, dass die gesuchte Datei aufgerufen Book1.gnumeric wird, verwenden Sie nicht, -inamesondern -name, es ist schneller:

find / -name 'Book1.gnumeric'

Drittens, denken Sie daran, das Muster wie in der anderen Antwort angegeben zu zitieren .

Und zum Schluss - sind Sie sicher, dass Sie die Datei überall auf Ihrem System suchen möchten ? Möglicherweise befindet sich die gesuchte Datei tatsächlich in Ihrem $HOMEVerzeichnis, wenn Sie daran gearbeitet oder sie von einer anderen Stelle heruntergeladen haben. Auch das kann viel schneller sein.

EDIT :

Mir ist aufgefallen, 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 außerdem vor, 2>/dev/nullam Ende der Zeile alle *permission denied*anderen Fehler zu verbergen , die auftreten, wenn Sie findals Benutzer ohne Rootberechtigung auf Folgendes zugreifen:

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

Und wenn Sie sicher sind, dass Sie nach einer einzelnen Datei suchen und es nur eine einzelne Datei auf Ihrem System gibt, die den Kriterien entspricht, die Sie findnach dem Auffinden der ersten übereinstimmenden Datei zum Beenden angeben können:

find / -iname 'book1*' -print -quit 2>/dev/null
Arkadiusz Drabczyk
quelle
1
-inameist nicht portabel
Gert van den Berg
6

Sie können den locateBefehl versuchen . Es verwendet eine Datenbank mit Dateinamen, um die Suche zu beschleunigen.

*book1*Verwenden Sie diese Option , um nach allen übereinstimmenden Dateien zu suchen und Groß- und Kleinschreibung zu ignorieren

locate -i book1

Wenn Sie nach Dateien suchen möchten, die mit "" beginnenbook1 , müssen Sie den Platzhalter selbst eingeben:

locate -i 'book1*'

Es ist viel schneller als find, aber nur so aktuell wie das letzte Mal, als die Datenbank aktualisiert wurde.

James K
quelle
5

Wenn Sie wissen, dass Sie eine Datei mit dem Namen haben book1.something, bei der der Speicherort, der genaue Wert somethingund das Groß- und Kleinschreibungsmuster des Dateinamens unbekannt sind:

find / -iname 'book1.*'

Wenn Sie nur sicher wissen, dass der Dateiname das Wort enthält book, können Sie mit eine wahrscheinlich viel größere Liste erstellen

find / -iname '*book*'

Das Argument für -nameist ein Shell-Glob-Muster. Vergleichen Sie in dem Verzeichnis, in dem sich die Datei befindet:

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

Dies stellt die Art der Suche dar, die von durchgeführt wird -name. Die -inameOption ermöglicht lediglich eine Version, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird.

Fuchs
quelle
1

POSIXly,

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

Meldet den Pfad aller Dateien , deren Name book1(mit jeder Variation von Fall ist , sondern nur die ASCII Berücksichtigung lateinische Buchstaben bokBOK, nicht die vielen anderen Variationen in Unicode wie 𝗄, 𝚔, 𝘬, , , , und alle ihre Variationen mit diakritischen Zeichen ...) in Alle Verzeichnisse, auf die Sie Lesezugriff haben.

Stéphane Chazelas
quelle
0

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 ( iregexist ein nicht zwischen Groß- und Kleinschreibung unterschiedener rationaler Ausdruck, und das Muster mit .*auf beiden Seiten würde mit jedem Zeichen vor und nach Ihrem festgelegten Muster von Buch1 übereinstimmen - dies könnte Ihnen offensichtlich mehr Ergebnisse als nötig zurückgeben aber Sie sind sicher, die Akte nicht zu verfehlen)

Der wesentliche Unterschied: wenn möglich, restriktiver sein als nur mit /, wie nur versuchen , /homeoder so, sonst hat man in einigen Verzeichnissen absteigen wird , die nicht relevant ist ( /sys, /dev, etc ...)

Beachten Sie jedoch, dass Unix-Berechtigungen gelten: Wenn sich die Datei in einem Verzeichnis befindet, für das der Benutzer, der den findBefehl ausführt, kein Zugriffsrecht (Ausführungsrecht) hat, findkann er sie dort nicht finden.

Patrick Mevzek
quelle
iregex funktioniert nicht unter Solaris (Betriebssystem wurde nicht angegeben) (und möglicherweise * BSD), es ist eine GNU-Erweiterung und nicht Teil des Standardsfind
Gert van den Berg
0

Silver Searcher ist eine sehr schnelle und praktische Anwendung, um nach Dateien und Inhalten zu suchen.

Um Ihr Problem zu lösen, würde der Befehl silver searcher so aussehen ...

ag -g Book1

-g PATTERN Drucken Sie die Dateinamen, die zum MUSTER passen

qoomon
quelle
0

locate und seine Varianten neigen dazu, eine schnelle Methode zu sein.

# 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 locate nicht verfügbar ist, können Sie findstattdessen verwenden. Es ist in der Regel viel langsamer, aber auch viel genauer.

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 keine -xdev findSuchvorgänge auf anderen Partitionen ausführen, wie z. B. /procund /sys, wird der Bildschirm häufig mit Fehlern überflutet, insbesondere wenn Sie kein Root-Benutzer sind. (Fehler können durch Anhängen 2> /dev/nullam Ende des Suchbefehls ausgeblendet werden (der Kommentar sollte entfernt werden))

Wenn Sie mehrere Partitionen haben und nicht wissen, auf welcher sich die Datei befindet, können Sie eine Liste mit lsblk(unter Linux-Betriebssystemen ist das Parsen der dfAusgabe eine andere Option) abrufen und Folgendes in find: (root, falls Sie dies wünschen) eingeben Ich weiß nicht, 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 etwas fragil, wenn einer Ihrer Mountpoints Leerzeichen enthält.) ( dfParameter müssen möglicherweise optimiert werden. -P bewirkt, dass GNU dfeine POSIX-Standardausgabe ausgibt. Andere Versionen haben möglicherweise andere Parameter oder müssen diese weglassen. Lesen Sie Ihre Manpage.)

Das grep -Fschließt andere zurückgegebene Dinge aus, wie zum Beispiel Swap-Partitionen.

In der Nicht-GNU-Version sucht awk nach Geräten mit einem Mount, der mit /devdem Abrufen realer Dateisysteme beginnt , und druckt dann das letzte Feld (den Mountpunkt) aus der dfAusgabe.

Dies setzt auch eine bourne-ähnliche Shell voraus ( kshund bashsollte funktionieren. Wenn Sie eine cshVariante verwenden, starten Sie eine skriptfähige Shell, bevor Sie dies versuchen)

Gert van den Berg
quelle
Das greps könnte etwas laut sein, lernen Sie, wie man es besser filtert (dies sollte im Beispiel nicht benötigt werden, aber wenn es etwas häufiger gesucht wird, müssten die Greps gestimmt werden, um den Geräuschpegel niedrig zu halten)
Gert van den Berg
0

ag (der silberne Sucher) bietet eine sehr schnelle Suche in Dateien und hat auch die Option, 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

In meinem Anwendungsfall ist es also> 30-mal schneller, wenn die Datei nicht von ag ignoriert wird.

tomtt
quelle