Ich habe nach einem Befehl gesucht, der Dateien aus dem aktuellen Verzeichnis zurückgibt, die eine Zeichenfolge im Dateinamen enthalten. Ich habe gesehen locate
und find
Befehle, die Dateien finden können, die mit etwas beginnen first_word*
oder mit etwas enden *.jpg
.
Wie kann ich eine Liste von Dateien zurückgeben, die eine Zeichenfolge im Dateinamen enthalten?
Zum Beispiel, wenn 2012-06-04-touch-multiple-files-in-linux.markdown
sich eine Datei im aktuellen Verzeichnis befand.
Wie kann ich diese und andere Dateien mit der Zeichenfolge zurückgeben touch
? Verwenden eines Befehls wiefind '/touch/'
man grep
, die zweite mitman find
. Warum sollten Sie googeln, anstatt Mann zu verwenden? Ich weiß es nicht.Antworten:
Verwendung
find
:find . -maxdepth 1 -name "*string*" -print
Es findet alle Dateien im aktuellen Verzeichnis (löschen,
maxdepth 1
wenn Sie es rekursiv möchten), die "Zeichenfolge" enthalten, und druckt es auf dem Bildschirm.Wenn Sie vermeiden möchten, dass eine Datei ':' enthält, können Sie Folgendes eingeben:
find . -maxdepth 1 -name "*string*" ! -name "*:*" -print
Wenn Sie Folgendes verwenden möchten
grep
(aber ich denke, es ist nicht erforderlich, wenn Sie den Dateiinhalt nicht überprüfen möchten), können Sie Folgendes verwenden:ls | grep touch
Aber ich wiederhole, es
find
ist eine bessere und sauberere Lösung für Ihre Aufgabe.quelle
find
ist ein sehr mächtiges Werkzeug, es muss irgendwie "lang" sein. :)-print
da dies das Standardverhalten ist und.
dies der Standardordner ist, in dem es überprüft wird.find . -name "*string*"
Funktioniert auch super. Das Entfernen.
wirft einen Fehler auf mein Ende. Nochmals vielen Dank @Zagorax.Verwenden Sie grep wie folgt:
-R
bedeutet rekursiv. Wenn Sie lieber nicht in die Unterverzeichnisse gehen möchten, überspringen Sie diese.-i
bedeutet "Fall ignorieren". Vielleicht ist dies auch einen Versuch wert.quelle
:
. Gibt es überhaupt etwas, um das zurückzuhalten? Vielleicht eine Option verwenden?grep -R "touch" . | cut -d ":" -f 2
grep -R "touch" . | cut -d ":" -f 1
(Entschuldigung, ich muss dich falsch verstanden haben).grep
Entweder gibt ich Dateien mit Inhalten und Dateinamen zurücktouch
oder Inhalte, die enthaltentouch
. Ich bin mir noch nicht sicher, was der Fall ist. Von der Liste der zurückgegebenen Dateien enthälttouch
die Hälfte den Titel und die andere Hälfte den Texttouch
, nicht den Titel. Hab das gerade gemerkt.Die
-maxdepth
Option sollte-name
wie unten vor der Option stehen.quelle
Dadurch wird das gesamte
$HOME
(dh/home/username/
) System nach Dateien mit dem Namen "hello.c" durchsucht und deren Pfadnamen angezeigt:Es wird jedoch nicht übereinstimmen
HELLO.C
oderHellO.C
. Wenn Sie die Groß- und Kleinschreibung nicht berücksichtigen, übergeben Sie die-iname
Option wie folgt:Beispielausgaben:
Übergeben Sie die
-type f
Option, nur nach Dateien zu suchen:Die Funktion
-iname
funktioniert entweder mit dem Befehl find der Version GNU oder BSD (einschließlich OS X). Wenn Ihre Version des Befehls find dies nicht unterstützt-iname
, versuchen Sie die folgende Syntax mit demgrep
Befehl:Oder Versuche
Beispielausgaben:
quelle
Wenn sich die Zeichenfolge am Anfang des Namens befindet, können Sie dies tun
quelle
compgen
ist kein geeigneter Hammer für diesen Nagel. Dieses wenig genutzte Tool wurde entwickelt, um verfügbare Befehle aufzulisten. Als solches listet es Dateien im aktuellen Verzeichnis auf (bei denen es sich um Skripte handeln kann) und kann weder den Anfang eines Dateinamens rekursieren noch über den Anfang hinausschauen oder den Inhalt der Datei durchsuchen meistens nutzlos.Eine Alternative zu den vielen bereits angebotenen Lösungen ist die Nutzung des Glob
**
. Wenn Siebash
mit der Optionglobstar
(shopt -s globstar
) verwenden oder verwendenzsh
, können Sie einfach den Glob**
dafür verwenden.führt eine rekursive Verzeichnissuche nach benannten Dateien durch
bar
(möglicherweise einschließlich der Dateibar
im aktuellen Verzeichnis). Beachten Sie, dass dies nicht mit anderen Formen des Globbens innerhalb desselben Pfadsegments kombiniert werden kann. In diesem Fall*
kehren die Bediener zu ihrer üblichen Wirkung zurück.Beachten Sie, dass es einen subtilen Unterschied zwischen
zsh
undbash
hier gibt. Währendbash
Soft-Links zu Verzeichnissen durchlaufen werden,zsh
wird dies nicht der Fall sein. Dafür müssen Sie den Glob***/
in verwendenzsh
.quelle
quelle
quelle