Ich habe versucht, eine Liste aller Python- und HTML-Dateien in einem Verzeichnis mit dem Befehl find Documents -name "*.{py,html}"
abzurufen.
Dann kam die Manpage:
Klammern innerhalb des Musters ('{}') werden nicht als speziell betrachtet (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-Chain ist, möchte ich in der Lage sein, anzugeben, welche Erweiterungen zur Laufzeit passen (kein Hardcoding). Wenn find es einfach nicht schafft, wäre ein Perl-Einzeiler (oder ähnliches) in Ordnung.
Edit: Die Antwort, zu der ich schließlich gekommen bin, umfasst alle möglichen Arten von Mist und ist auch ein bisschen lang. Deshalb habe ich sie als eine Antwort zu dem ursprünglichen Kratzer gepostet, den ich zu kratzen versuchte. Fühlen Sie sich frei, das zu hacken, wenn Sie bessere Lösungen haben.
Verwenden Sie -o
, was "oder" bedeutet:
find Documents \( -name "*.py" -o -name "*.html" \)
Edit : Entschuldigung, lies einfach die Frage nochmal ... du müsstest diese Kommandozeile programmgesteuert aufbauen, was nicht so einfach ist.
Verwenden Sie bash (oder Cygwin unter Windows)? Wenn ja, sollten Sie dies können:
ls **/*.py **/*.html
was einfacher zu programmieren ist.
Bearbeiten : Angewendeter @artbristol-Kommentar zur Antwort.
Einige Editionen von find, meist auf Linux-Systemen, möglicherweise auch auf anderen, unterstützen die Optionen -regex und -regextype, die Dateien mit Namen finden, die der Regex entsprechen.
zum Beispiel
find . -regextype posix-egrep -regex ".*\.(py|html)$"
sollte den Trick in dem obigen Beispiel ausführen. Dies ist jedoch keine standardmäßige POSIX-Suchfunktion und hängt von der Implementierung ab.
Sie können programmgesteuert weitere -name
-Klauseln hinzufügen, getrennt durch -or
:
find Documents \( -name "*.py" -or -name "*.html" \)
Oder wählen Sie stattdessen eine einfache Schleife:
for F in Documents/*.{py,html}; do ...something with each '$F'... ; done
Ich hatte ein ähnliches Bedürfnis. Das hat für mich funktioniert:
find ../../ \( -iname 'tmp' -o -iname 'vendor' \) -Prune -o \( -iname '*.*rb' -o -iname '*.rjs' \) -print
Dadurch werden alle .c- oder .cpp-Dateien unter Linux gefunden
$ find . -name "*.c" -o -name "*.cpp"
Sie brauchen die gekapselten Klammern nicht, wenn Sie einige zusätzliche Mods ausführen. Hier auf der Manpage wird angegeben, ob das Muster übereinstimmt. Drucken Sie es aus. Vielleicht versuchen sie, den Druck zu kontrollieren. In diesem Fall fungiert der -print als Bedingung und wird zu einer UND-Bedingung. Es wird verhindert, dass .c-Dateien gedruckt werden.
$ find . -name "*.c" -o -name "*.cpp" -print
Wenn Sie jedoch die ursprüngliche Antwort mögen, können Sie den Druck steuern. Dadurch werden auch alle .c-Dateien gefunden.
$ find . \( -name "*.c" -o -name "*.cpp" \) -print
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 .:
find Documents \( -name "*.py" -or -name "*.html" \)
#! /bin/bash
filetypes="*.py *.xml"
for type in $filetypes
do
find Documents -name "$type"
done
einfach aber funktioniert :)
Ich musste alle Dateien in untergeordneten Verzeichnissen mit Ausnahme einiger Dateien entfernen. Folgendes funktionierte für mich (drei Muster angegeben):
find . -depth -type f -not -name *.itp -and -not -name *ane.gro -and -not -name *.top -exec rm '{}' +
find MyDir -iname "*.[j][p][g]"
+
find MyDir -iname "*.[b][m][p]"
=
find MyDir -iname "*.[jb][pm][gp]"
Wie wäre es mit
ls {*.py,*.html}
Es listet alle Dateien mit den Dateinamen .py oder .html auf
Klammern innerhalb des Musters \(\)
sind erforderlich für Namensmuster mit or
find Documents -type f \( -name "*.py" -or -name "*.html" \)
Für das Namensmuster mit dem Operator and
ist dies nicht erforderlich
find Documents -type f ! -name "*.py" -and ! -name "*.html"
Dies funktioniert bei AIX Korn Shell.
find *.cbl *.dms -Prune -type f -mtime -1
Hier wird nach *.cbl
oder *.dms
gesucht, die nur im aktuellen Verzeichnis einen Tag alt sind. Dabei werden die Unterverzeichnisse übersprungen.