Beim grep
Durchsuchen des Inhalts von Dateien wird zunächst nicht nach Dateinamen gesucht. Dafür willst du find
. 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:
$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
├── a
├── ab
├── abc
└── abcd
Die Suche nach Dateien in diesem Verzeichnis gibt Folgendes zurück:
$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/abcd
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 /
:
$ find . -type f | grep -P '/.{3}$'
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:
find . -type f | grep -P '/...$'
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):
find . -type f | grep -P '/.{1}\.'
Dies findet jedoch auch Dateien wie a.bo.go
. Dies ist besser, wenn Ihre Dateinamen mehr als einen enthalten können .
:
find . -type f | grep -P '/.{1}\.[^.]+$'
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.
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.