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 book1
aber 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:
- Die Dateierweiterung ist unbekannt
- Der genaue Name (dh Großbuchstaben, Zahlen usw.) ist unbekannt
- Der Speicherort der Datei ist unbekannt
command-line
files
find
Aspire27
quelle
quelle
Book1
wird und sich in einem Verzeichnis befindet, das Sie lesen können,find / -iname book1
wird sie gefunden. Sind Sie sicher, dass dies tatsächlich der Fall istBook1
und nichtBook1.xyz
?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 Datei-Glob, der Art von Muster, in der Sie verwenden würdenls
. Du meinst wahrscheinlichiname '*book1*'
. Beachten Sie, dass das Muster in Anführungszeichen stehen muss, damit die Shell es nicht erweitert, bevor esfind
angezeigt wird. Beachten Sie auch, dass esfind
, wie bei vielen * nix-Befehlen, frustrierend leise ist, wenn es nicht erfolgreich ist.Antworten:
Erstens ist ein Argument für
-iname
ein 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 Dateifind
tatsächlich gefunden werden kann. Um eine Zeichenfolge zu erstellen , bei der die Groß- und Kleinschreibung nicht beachtet wirdbook1
, müssenBook1.gnumeric
Sie Folgendes hinzufügen*
:oder geben Sie den vollständigen Namen an:
Zweitens
-iname
wirdfind
die Groß- und Kleinschreibung des Dateinamens ignoriert. Wenn Sie also angeben, dass-iname book1
er möglicherweise auch gefunden wirdBook1
,bOok1
usw. Wenn Sie sicher sind, dass die gesuchte Datei aufgerufenBook1.gnumeric
wird, verwenden Sie nicht,-iname
sondern-name
, es ist schneller: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
$HOME
Verzeichnis, 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:
Ich schlage außerdem vor,
2>/dev/null
am Ende der Zeile alle*permission denied*
anderen Fehler zu verbergen , die auftreten, wenn Siefind
als Benutzer ohne Rootberechtigung auf Folgendes zugreifen: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
find
nach dem Auffinden der ersten übereinstimmenden Datei zum Beenden angeben können:quelle
-iname
ist nicht portabelSie können den
locate
Befehl 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 ignorierenWenn Sie nach Dateien suchen möchten, die mit "" beginnen
book1
, müssen Sie den Platzhalter selbst eingeben:Es ist viel schneller als
find
, aber nur so aktuell wie das letzte Mal, als die Datenbank aktualisiert wurde.quelle
Wenn Sie wissen, dass Sie eine Datei mit dem Namen haben
book1.something
, bei der der Speicherort, der genaue Wertsomething
und das Groß- und Kleinschreibungsmuster des Dateinamens unbekannt sind:Wenn Sie nur sicher wissen, dass der Dateiname das Wort enthält
book
, können Sie mit eine wahrscheinlich viel größere Liste erstellenDas Argument für
-name
ist ein Shell-Glob-Muster. Vergleichen Sie in dem Verzeichnis, in dem sich die Datei befindet:Dies stellt die Art der Suche dar, die von durchgeführt wird
-name
. Die-iname
Option ermöglicht lediglich eine Version, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird.quelle
POSIXly,
Meldet den Pfad aller Dateien , deren Name
book1
(mit jeder Variation von Fall ist , sondern nur die ASCII Berücksichtigung lateinische BuchstabenbokBOK
, nicht die vielen anderen Variationen in Unicode wie𝗄
,𝚔
,𝘬
,ᵏ
,ₖ
,K
,k
und alle ihre Variationen mit diakritischen Zeichen ...) in Alle Verzeichnisse, auf die Sie Lesezugriff haben.quelle
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 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 ,/home
oder 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
find
Befehl ausführt, kein Zugriffsrecht (Ausführungsrecht) hat,find
kann er sie dort nicht finden.quelle
find
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 passenquelle
locate
und seine Varianten neigen dazu, eine schnelle Methode zu sein.Wenn locate nicht verfügbar ist, können Sie
find
stattdessen 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)
Wenn Sie keine
-xdev
find
Suchvorgänge auf anderen Partitionen ausführen, wie z. B./proc
und/sys
, wird der Bildschirm häufig mit Fehlern überflutet, insbesondere wenn Sie kein Root-Benutzer sind. (Fehler können durch Anhängen2> /dev/null
am 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 derdf
Ausgabe 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.)(Dies ist etwas fragil, wenn einer Ihrer Mountpoints Leerzeichen enthält.) (
df
Parameter müssen möglicherweise optimiert werden. -P bewirkt, dass GNUdf
eine POSIX-Standardausgabe ausgibt. Andere Versionen haben möglicherweise andere Parameter oder müssen diese weglassen. Lesen Sie Ihre Manpage.)Das
grep -F
schließ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
/dev
dem Abrufen realer Dateisysteme beginnt , und druckt dann das letzte Feld (den Mountpunkt) aus derdf
Ausgabe.Dies setzt auch eine bourne-ähnliche Shell voraus (
ksh
undbash
sollte funktionieren. Wenn Sie einecsh
Variante verwenden, starten Sie eine skriptfähige Shell, bevor Sie dies versuchen)quelle
grep
s 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)ag (der silberne Sucher) bietet eine sehr schnelle Suche in Dateien und hat auch die Option, nach Dateinamen zu suchen:
In meinem Anwendungsfall ist es also> 30-mal schneller, wenn die Datei nicht von ag ignoriert wird.
quelle