Wie kann man nach allen Dateien suchen, die mit dem Namen "ABC" in einem Verzeichnis beginnen?


58

Ich muss nach Dateien suchen, die mit einem bestimmten Namen beginnen. Es kann mehrere Dateien geben, die mit einem bestimmten Muster beginnen, und ich möchte alle im Verzeichnis vorhandenen Dateien auflisten.

Antworten:


60

So vervollständigen Sie vorhandene Antworten:

ls

Das Standard-Verzeichnislisten-Dienstprogramm lskann 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 treenach 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 treeselbst Platzhalter unterstützt.


2
Warum, wenn ich es tue, ls -l B*zeigt es den Inhalt aller Verzeichnisse, die mit Bnur den Namen der übereinstimmenden Verzeichnisse beginnen?
ErikE

@ErikE Wenn Sie lsein 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*.
Azor Ahai

@AzorAhai Aber warum wird es B*als Verzeichnisspezifikation behandelt ?
ErikE

@ErikE Da die Verwendung der Datei glob so B*erweitert wird, dass sie mit allen Verzeichnissen übereinstimmt, die mit beginnen B, übergeben Sie wirklich lseine Liste von Verzeichnissen, sodass sie alle für Sie geöffnet werden.
Azor Ahai

1
Beantwortet die Frage nicht. 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.
Greatvovan

42

Sie können den findBefehl 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 findBefehl zum Suchen des Dateinamens anhand eines Musters


7

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 ABCIhren Text ersetzen .

Um den Befehl zu verstehen, lassen Sie ihn uns etwas aufschlüsseln:

  • findlistet alle Dateien unter dem aktuellen Verzeichnis und seinen Unterverzeichnissen auf; Wenn Sie es alleine verwenden, wird dort einfach alles aufgelistet. Beachten Sie, dass findjede 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 ./ABCund 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 findweitergeleitet grep. Dies nennt man Verrohrung.

  • grepNimmt die Ausgabe und filtert sie nach dem vorgegebenen Muster ^\./ABC.

    • Beachten Sie, dass das Muster in einfachen Anführungszeichen steht ' ', 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 grepes 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.)


1
Warum sollten Sie es tun, find | grepwenn findes seine eigenen, vollkommen guten Musteranpassungsfähigkeiten hat?
Darael

3

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

2

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).

Bildbeschreibung hier eingeben

Geben Sie dann einfach den regulären Ausdruck ein ABC* und bestätigen Sie.

Bildbeschreibung hier eingeben

Jede Datei, deren Name mit Ihrem Muster übereinstimmt, wird automatisch ausgewählt.

Bildbeschreibung hier eingeben

Ich verwende Nautilus 3.6. * Von GNOME3 PPA unter Ubuntu 12.10 (Quantal).


1

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"

1

Wenn Sie das Verzeichnis, in dem sich die ABC*Dateien befinden, nicht kennen und über Millionen von Dateien verfügen, ist der locateBefehl 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:

  • Der obige Befehl benötigt 1 Sekunde, um mit 1 Million Dateien ausgeführt zu werden.
  • Im Vergleich dazu wird der findBefehl, der im /Stammverzeichnis beginnt, sehr lange dauern und viele Berechtigungsfehler verursachen.
  • Wenn heute Dateien erstellt wurden, müssen Sie sudo updatedbzuerst ausführen .

0

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.


0

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  },".")' 

0
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.


Das echo /path/to/files/ABC* | tr " " "\n"ist keine gute Idee. Überlegen Sie, ob eine Datei /path/to/files/ABC EFGvorhanden ist und der Dateiname ein Leerzeichen enthält. Sie trwerden 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
Sergiy Kolodyazhnyy

0

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:

  • Dateien und Puffer öffnen
  • Zu Tags springen und helfen
  • Ausführen von Befehlen oder vorherigen Suchen und Befehlen
  • mit einer minimalen Anzahl von Tastenanschlägen.

Wie du siehst

Bildbeschreibung hier eingeben

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.


0

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.