Ich habe versucht, mit dem Befehl eine Liste aller Python- und HTML-Dateien in einem Verzeichnis abzurufen find Documents -name "*.{py,html}"
.
Dann kam die Manpage:
Klammern innerhalb des Musters ('{}') gelten nicht als speziell (dh find. -Name 'foo {1,2}' entspricht einer Datei mit dem Namen foo {1,2}, nicht den Dateien foo1 und foo2.
Da dies Teil einer Pipe-Kette ist, möchte ich angeben können, mit welchen Erweiterungen sie zur Laufzeit übereinstimmt (keine Hardcodierung). Wenn find es einfach nicht kann, wäre ein Perl-Einzeiler (oder ähnliches) in Ordnung.
Bearbeiten: Die Antwort, die ich schließlich gefunden habe, enthält alle Arten von Mist und ist auch ein bisschen lang, also habe ich sie als Antwort auf den ursprünglichen Juckreiz gepostet , den ich zu kratzen versuchte. Fühlen Sie sich frei, das zu hacken, wenn Sie bessere Lösungen haben.
locate
, wenn auch mit der Einschränkung, dass das interne Updateb möglicherweise nicht auf dem neuesten Stand ist. Aber es ist schnell.Antworten:
Verwenden Sie
-o
, was "oder" bedeutet:Sie müssten diese Befehlszeile programmgesteuert erstellen, was nicht so einfach ist.
Verwenden Sie Bash (oder Cygwin unter Windows)? Wenn ja, sollten Sie in der Lage sein:
Das könnte einfacher programmgesteuert sein.
quelle
**
rekursive Suche; Bash unterstützt es nur in Versionen 4.0 und höher und nur mitshopt -s globstar
.-name
s mit Klammern umgeben, wenn Sie verwenden-exec
. ZBfind Documents \( -name "*.py" -o -name "*.html" \) -exec file {} \;
-print0
, um Dateinamen mit Leerzeichen zu behandeln.Einige Editionen von find, hauptsächlich auf Linux-Systemen, möglicherweise auch auf anderen, unterstützen die Optionen -regex und -regextype, wodurch Dateien mit Namen gefunden werden, die mit dem regulären Ausdruck übereinstimmen.
zum Beispiel
sollte den Trick im obigen Beispiel tun. Dies ist jedoch keine Standard-POSIX-Suchfunktion und ist implementierungsabhängig.
quelle
find . -regex ".*\.\(py\|html\)$"
Dies funktioniert, da standardmäßig reguläre Ausdrücke im Emacs-Stil gefunden werden, die sich geringfügig unterscheiden, sodass Sie den regulären Texttyp nicht angeben müssen.-regextype posix-egrep
ist dies praktisch (andernfalls müssen Sie viele Zeichen maskieren). Dies ist der Befehl find, den ich für einen Dist-Hook verwendet habe, der eine Windows-Distributions-Zip-Datei erstellt (findet die zu ändernden Dateien und ändert sie in der Datei in dos-eol):find -regextype posix-egrep -regex ".*(\.([chyl]|def|cpy|cob|conf|cfg)|(README|ChangeLog|AUTHORS|ABOUT-NLS|NEWS|THANKS|TODO|COPYING.*))$" -exec sed -i -e 's/\r*$/\r/' {} \;
Sie können programmgesteuert weitere
-name
Klauseln hinzufügen , die durch Folgendes getrennt sind-or
:Oder wählen Sie stattdessen eine einfache Schleife:
quelle
*.py
Dateien oder Sie haben eine ungerade Version vonfind
. Der oben aufgeführte Befehl funktioniert einwandfrei.-iname
. Es zurückkehren*.py
Dateien nur , wenn Schreib es in der letzten Position (soiname *.html
der erste Ausdruck ist) . Ich benutze den Befehl auf Debian.Dadurch werden alle .c- oder .cpp-Dateien unter Linux gefunden
Du brauchst die maskierte Klammer nicht, es sei denn, du machst einige zusätzliche Mods. Hier von der Manpage sagen sie, wenn das Muster übereinstimmt, drucken Sie es aus. Vielleicht versuchen sie, das Drucken zu kontrollieren. In diesem Fall fungiert der -print als Bedingung und wird zu einer "AND'd" -Bedingung. Dadurch wird verhindert, dass C-Dateien gedruckt werden.
Wenn Ihnen die ursprüngliche Antwort gefällt, können Sie den Druck steuern. Dadurch werden auch alle .c-Dateien gefunden.
Ein letztes Beispiel für alle c / c ++ - Quelldateien
quelle
Ich hatte ein ähnliches Bedürfnis. Das hat bei mir funktioniert:
quelle
()
find -name "*.cpp" -o -name "*.c" -o -name "*.cc" -print0
ich ein Paar Parens verwenden Gruppieren Sie den zweiten oder Operator.find -name "*.cpp" -o \( -name "*.c" -o -name "*.cc" \) -print0
Es kann sein, dass der -print0, der immer "true" ist, die Logik beeinflusst hat.Mein Standard war:
find -type f | egrep -i "*.java|*.css|*.cs|*.sql"
Wie die weniger prozessintensive
find
Ausführung von Brendan Long und Stephan202 et al.:quelle
egrep
regulärem Ausdruck, sondern Sie haben einen Shell-Glob, in dem ein regulärer Ausdruck verwendet werden sollte. (Typischefind
Verwendung ist auch :find {directory} [options...] [action]
, wo, abhängig von impl,directory
standardmäßig.
undaction
standardmäßig verwendet wird-print
, aber ich werde explizit sein.) Verwenden Sie stattdessen etwas wie:find . -type f -print | egrep -i '\.java$|\.css$|\.cs$|\.sql$'
Aber auch, als wirklich schnelle Alternative zufind
, könnte man auch versuchen Sie eslocate
auf ähnliche Weise (wenn auch nicht unbedingt aktuell, da eine interne Datenbank nach einer Dateilisteeinfach aber funktioniert :)
quelle
Ich musste alle Dateien in untergeordneten Verzeichnissen mit Ausnahme einiger Dateien entfernen. Folgendes hat bei mir funktioniert (drei Muster angegeben):
quelle
Klammern innerhalb des Musters
\(\)
sind für das Namensmuster mit erforderlichor
Während für das Namensmuster mit
and
Operator es nicht erforderlich istquelle
Dies funktioniert auf AIX Korn Shell.
Dies sucht
*.cbl
oder*.dms
ist 1 Tag alt, nur im aktuellen Verzeichnis, wobei die Unterverzeichnisse übersprungen werden.quelle
quelle
Wie wäre es mit
Es listet alle Dateien auf, die in ihren Dateinamen mit .py oder .html enden
quelle