Antworten:
So vervollständigen Sie vorhandene Antworten:
ls
Das Standard-Verzeichnislisten-Dienstprogramm ls
kann in Kombination mit den Platzhaltern der Shell verwendet werden. So suchen Sie nach allen Dateien mit Muster abc
:
ls abc* # list all files starting with abc---
ls *abc* # list all files containing --abc--
ls *abc # list all files ending with --abc
Beachten Sie, dass die Dateierweiterung auch für die Suchergebnisse relevant ist.
tree
Falls wir Dateien in einem Verzeichnisbaum auflisten müssen, können wir auch tree
nach einem bestimmten Muster suchen :
tree -P 'abc*' # list directory tree of file starting with abc---
tree -l 'def*' # exclude files starting with def---
In diesem Fall werden tree
selbst Platzhalter unterstützt.
ls
ein Verzeichnis auflisten möchten , wird es geöffnet. Das entspricht dem Vorgang ls -l BirthdayPhotos
. Sie können dieses Verhalten mit unterdrücken ls -d B*
.
B*
als Verzeichnisspezifikation behandelt ?
B*
erweitert wird, dass sie mit allen Verzeichnissen übereinstimmt, die mit beginnen B
, übergeben Sie wirklich ls
eine Liste von Verzeichnissen, sodass sie alle für Sie geöffnet werden.
ls -d ABC*
war, was der Autor fragte. Auch Kommentare im Code-Snippet sind falsch, ls abc*
listet den Inhalt von Verzeichnissen auf, die mit abc beginnen.
Sie können den find
Befehl verwenden, um Dateien mit einem Muster zu suchen
find . -type f -name "abc*"
Der obige Befehl durchsucht die Datei, die mit abc beginnt, unter dem aktuellen Arbeitsverzeichnis.
-name 'abc'
listet die Dateien auf, die genau übereinstimmen. ZB: abc
Sie können auch verwenden
-iname
-regex
Option mit find
Befehl zum Suchen des Dateinamens anhand eines Musters
Es gibt viele Möglichkeiten, dies zu tun, je nachdem, was Sie genau damit machen möchten. Wenn Sie sie nur auflisten möchten, können Sie dies im Allgemeinen in einem Terminal tun, indem Sie Folgendes verwenden:
find | grep '^\./ABC'
... und durch ABC
Ihren Text ersetzen .
Um den Befehl zu verstehen, lassen Sie ihn uns etwas aufschlüsseln:
find
listet alle Dateien unter dem aktuellen Verzeichnis und seinen Unterverzeichnissen auf; Wenn Sie es alleine verwenden, wird dort einfach alles aufgelistet. Beachten Sie, dass find
jede Datei oder jedes Verzeichnis beginnend mit ./
ausgegeben wird, wobei angegeben wird , dass der Pfad relativ zum aktuellen Verzeichnis ist. Es ist wichtig, sich dessen bewusst zu sein, denn dies bedeutet, dass wir nach Ergebnissen suchen, die mit ./ABC
und nicht nur mit beginnen ABC
.
Das Pipe-Zeichen |
leitet die Ausgabe eines Befehls an einen anderen weiter. In diesem Fall wird die Ausgabe von an find
weitergeleitet grep
. Dies nennt man Verrohrung.
grep
Nimmt die Ausgabe und filtert sie nach dem vorgegebenen Muster ^\./ABC
.
' '
, um zu verhindern, dass die Shell die darin enthaltenen Sonderzeichen interpretiert.Jetzt wird das Muster selbst in einer bestimmten Syntax geschrieben, die als regulärer Ausdruck oder kurz Regex bezeichnet wird . Regex ist ein äußerst leistungsfähiges Suchwerkzeug, wenn Sie es beherrschen, und es gibt Websites wie diese, die Sie ausführlicher darüber informieren. Beachten Sie jedoch, dass grep
es sich nicht um eine vollwertige Regex-Engine handelt und Sie nicht alles damit machen können.
Für unseren Zweck:
^
in Regex entspricht dem Anfang der Zeichenfolge; Dadurch wird verhindert, dass es mit dem Muster übereinstimmt, wenn es nicht am Anfang des Dateinamens steht.
.
In Regex hat das auch eine besondere Bedeutung: Es bedeutet "hier ein beliebiges einzelnes Zeichen finden". Wenn Sie ihn als wörtlichen Punkt verwenden möchten, müssen Sie ihn mit einem Backslash "maskieren" \
. (Ja, es wäre in unserem Fall harmlos, jedes Zeichen abzugleichen, aber ich habe es der Vollständigkeit halber getan.)
find | grep
wenn find
es seine eigenen, vollkommen guten Musteranpassungsfähigkeiten hat?
Sie können GREP verwenden. Ich denke, dies ist die einfachste Lösung. Fügen Sie wahrscheinlich auch einige andere grep-Parameter hinzu, um die Übereinstimmung genauer zu machen
tree | grep ABC
Sie können mit dem Nautilus-Dateimanager und regulären Ausdrücken nach einem bestimmten Muster suchen.
Klicken Sie dazu im Menü Ausrüstung wie unten auf Passende Elemente auswählen (Sie können auch Ctrl+ drücken s).
Geben Sie dann einfach den regulären Ausdruck ein ABC*
und bestätigen Sie.
Jede Datei, deren Name mit Ihrem Muster übereinstimmt, wird automatisch ausgewählt.
Ich verwende Nautilus 3.6. * Von GNOME3 PPA unter Ubuntu 12.10 (Quantal).
Die einfachste Lösung für mich
ls | grep PATTERN
Hier können Sie einen beliebigen regulären Ausdruck im PATTERN angeben.
Um beispielsweise Dateien mit "ab" an einer beliebigen Stelle im Namen zu finden, geben Sie Folgendes ein
ls | grep ".*ab.*"
Um die Dateien zu finden, die mit "ab" beginnen, geben Sie ein
ls | grep "^ab"
Wenn Sie das Verzeichnis, in dem sich die ABC*
Dateien befinden, nicht kennen und über Millionen von Dateien verfügen, ist der locate
Befehl die schnellste Methode.
$ locate /ABC
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABC6AD2FEC16465049B48D39FD2FE538258F2A34
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABCBFDA54262F47253F95ED6ED4131A465EE0E39
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
/mnt/old/home/rick/.cache/mozilla/firefox/3vkvi6ov.default/cache2/entries/ABC0C99FCEABAD0C6AA2078CD025A1CDE48D7BA1
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
Anmerkungen:
find
Befehl, der im /
Stammverzeichnis beginnt, sehr lange dauern und viele Berechtigungsfehler verursachen.sudo updatedb
zuerst ausführen .ich benutze
ls | grep abc
oder
ls -la | grep abc
Es werden alle Dateien mit abc angezeigt, nicht nur abc. Aber es ist eine sehr einfache Möglichkeit für mich, dies zu tun.
Python:
$ python -c 'import sys,os;found=[os.path.join(r,i) for r,s,f in os.walk(".") for i in f if i.startswith("ABC")];map(lambda x: sys.stdout.write(x+"\n") ,found)'
Perl:
$ perl -le 'use File::Find;find(sub{ -f && $_ =~/^ABC/ && print $File::Find::name },".")'
printf "%s" /path/to/files/ABC*
Dies ist der Glob-Pattern-Matching, der an beiden Enden verankert ist. Dies stimmt mit allen Vorkommen von Dateien überein, die mit "ABC" beginnen, z. B. "ABC", "ABC.txt", "ABC123", jedoch nicht "xABC". Von der Befehlszeile aus ist die Verwendung von 'ls' anstelle von 'printf' eine sichere Alternative. Je nachdem, mit wem Sie einverstanden sind, ist 'ls' jedoch für die Verwendung in einem Skript nicht sicher. In diesem Fall wird die Verwendung von 'printf' mit Glob-Pattern-Matching als sicher angesehen. Wenn Sie dies in einem Skript verwenden möchten, enthält die Ausgabe von 'printf' bis zum Ende des Ausgabestreams kein neues Zeilenzeichen:
printf "%s" /path/to/files/ABC*
Kehrt zurück:
/path/to/files/ABC /path/to/files/ABC123
Wenn Sie nach jeder Instanz Zeilenumbrüche benötigen:
printf "%s\n" /path/to/files/ABC*
Kehrt zurück:
/path/to/files/ABC
/path/to/files/ABC123
"/ path / to / files /" bleibt in der Ausgabe erhalten, wenn Sie dies beim Ausführen des Befehls 'printf' so eingegeben haben. Ohne es erscheint nur der Dateiname:
printf "%s" ABC*
Kehrt zurück
ABC ABC123
Angenommen, Sie führen den Befehl in dem Verzeichnis aus, in dem sich die Dateien befinden.
echo /path/to/files/ABC* | tr " " "\n"
ist keine gute Idee. Überlegen Sie, ob eine Datei /path/to/files/ABC EFG
vorhanden ist und der Dateiname ein Leerzeichen enthält. Sie tr
werden den Dateinamen in zwei separate Zeilen aufteilen, was nicht gut ist. Schlimmer noch, wenn der Dateiname mehrere Leerzeichen enthält. Ich würde empfehlen, printf "%s\n" ABC*
stattdessen zu verwenden, die mit Leerzeichen in den Dateinamen helfen sollte, aber immer noch mit anderen Sonderzeichen wie problematisch ist\n
Kommando-t in einem meiner Lieblings-Vim-Plugins, es ist ein Ruby-basiertes Plugin über der Integration mit FZF.
Mit Comamnd-T und FZF können Sie mit einem extrem schnellen "Fuzzy" -Mechanismus nach Folgendem suchen:
Wie du siehst
Ich suche immer im Befehlsverlauf, indem ich ein neues Terminal öffne und drücke:
CTRL+R
Zusätzlich zum rekursiven Durchsuchen aller Ordner durch Schreiben in eine beliebige Terminalregisterkarte:
fzf
Dann starten Sie Ihren Dateinamen
ABC
Sie können auch hinein schreiben vim
:CommandT
Besonders in großen Ordnern sehr hilfreich.
Angenommen, ich befinde mich im Stammverzeichnis und möchte nur die Liste des Verzeichnisses etc: Wir schreiben,
find -type d -name "etc"
Ergebnis bekommen wir,
[root@unix /]# find -type d -name "etc"
./etc
./usr/lib/firefox/bundled/etc
./usr/lib/unix-yarn/etc
./usr/lib/unix/etc
./usr/lib/festival/etc
./usr/bin/lib/vmware-tools/lib64/libconf/etc
./usr/bin/lib/vmware-tools/lib32/libconf/etc
./usr/etc
./usr/share/doc/oddjob-0.30/sample/etc
./usr/share/festival/lib/etc
./usr/local/etc
./usr/java/jdk1.7.0_25/lib/visualvm/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib64/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib32/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/caf/etc
Ein anderes Beispiel,
Wir können auch schreiben:
ls | grep "etc"
wir bekommen,
etc
ls -l B*
zeigt es den Inhalt aller Verzeichnisse, die mitB
nur den Namen der übereinstimmenden Verzeichnisse beginnen?