Ich möchte alle Dateien nach Länge der Dateinamen finden.
Zum Beispiel, wenn ich Dateien mit einer Länge von 1, wie zu finden a.go
, b.go
.
Ich setze:
grep '.\{1\}' file
Das geht aber nicht. Mit welchem Befehl kann ich Dateien nach Dateinamenlänge suchen?
a.go
ist ein Dateiname der Länge 4.a
ist ein Dateiname der Länge 1. Dies ist Unix, nicht DOS, bei dem Name und Erweiterung getrennt waren und ein implizites Element.
immer Teil des Dateinamens war.Antworten:
grep
sucht nach Mustern im Inhalt der Dateien. Wenn Sie sich die Namen der Dateien ansehen möchten , können Sie einfach einen Shell-Glob verwenden (wenn Sie nur Dateinamen im aktuellen Verzeichnis berücksichtigen möchten):(Übrigens ist es die Shell, die den Glob auswertet, nicht den
echo
Befehl.)Wenn Sie rekursiv in Verzeichnissen suchen möchten, beginnend mit dem aktuellen Verzeichnis, müssen Sie Folgendes verwenden
find
:(Beachten Sie, dass Sie das Muster in Anführungszeichen setzen müssen, um zu verhindern, dass die Shell es als Glob auswertet, bevor es
find
aufgerufen wird.)quelle
Wenn Sie nur die Dateinamen suchen möchten, können Sie den folgenden Befehl verwenden:
Das wird ausgeführt
find
, wobei der Name der Datei oder des Verzeichnisses mit abgezogen wirdbasename
und dann nach einem Dateinamen oder Verzeichnisnamen mit mindestens 100 Zeichen gesucht wird. Wenn Sie einen Dateinamen mit einer genauen Länge suchen möchten, verwenden Sie{100}
anstelle von{100,}
.Wenn Sie die Dateinamen einschließlich des Pfads suchen möchten, gehen Sie folgendermaßen vor:
Dadurch wird der Dateiname einschließlich des relativen Pfads zurückgegeben, zu dem Sie den Befehl find ausgeführt haben.
quelle
Beim
grep
Durchsuchen des Inhalts von Dateien wird zunächst nicht nach Dateinamen gesucht. Dafür willst dufind
. Es gibt keine Option zum Festlegen der Dateinamenlänge, aber Sie können die Ausgabe analysieren, um das zu erhalten, was Sie möchten. Hier sind einige Beispiele, die ich in einem Verzeichnis ausführe, das die folgenden Dateien enthält:Die Suche nach Dateien in diesem Verzeichnis gibt Folgendes zurück:
Um also die Dateien mit einer Länge von X zu finden, müssen wir den Pfad entfernen und nur die Zeichen nach dem letzten abgleichen
/
:Der
sed
Befehl entfernt nur das./
. Das-P
Flag aktiviert Perl-kompatible reguläre Ausdrücke, für{n}
die eine PCRE-Sache benötigt wird, und$
bedeutet "Match the End of the String".Sie können dies auch einfach tun:
Das ist in Ordnung für kleine Zahlen, die 15 Punkte eingeben, um mit Dateinamen der Länge 15 übereinzustimmen. Dies ist nicht sehr effizient.
Wenn Sie die Erweiterung ignorieren und nur den Dateinamen abgleichen möchten, gehen Sie wie folgt vor (wie von @slm vorgeschlagen):
Dies findet jedoch auch Dateien wie
a.bo.go
. Dies ist besser, wenn Ihre Dateinamen mehr als einen enthalten können.
:HINWEIS: Bei der obigen Lösung wird davon ausgegangen, dass Sie relativ gesunde Dateinamen haben, die keine neuen Zeilenzeichen usw. enthalten. Bei der Berechnung der Länge, die möglicherweise nicht Ihren Wünschen entspricht, werden auch Leerzeichen in Dateinamen nicht ignoriert. Wenn eines dieser Probleme vorliegt, lassen Sie es mich wissen und ich werde meine Antwort aktualisieren.
quelle
Sie geben nicht an, aber wenn sich die Dateien in einer Verzeichnisstruktur befinden, können Sie
find
Dateien mit der Länge 1 mithilfe von Folgendem suchengrep
:Beispiel
quelle
ggrep
: heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html . Beachten Sie auch, dass dieses Q nicht als OSX markiert wurde, sodass die Verwendung vongrep
geeignet ist.Ich würde so etwas benutzen.
Also, wenn Sie zwei "?" dann suchen Sie nach Dateinamen mit zwei Zeichen und der Erweiterung.
quelle
Wenn Sie den regulären Ausdruck im Befehl find verwenden möchten, sollten Sie Folgendes verwenden
""
:für Ihren Fall verwenden:
Sie sollten Ihren realen Pfad durch Ihren Pfad ersetzen. Dies
-a
bedeutetAnd
-type f
, dass Sie nur nach regulären Dateien suchen.?
In Ihrer Abfrage bedeutet ein Zeichen wie DOS, wenn Sie sich erinnern.quelle
ls ?.*
sollte Ihnen die gewünschten Ergebnisse liefern.quelle