it-swarm.com.de

`find -name` Muster, das mehreren Mustern entspricht

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.

262
Xiong Chiamiov

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. 

399
RichieHindle

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.

48
intelekt

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
27
Stephan202

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
10
bkidd

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
8
netskink

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" \)

4
Paul
#! /bin/bash
filetypes="*.py *.xml"
for type in $filetypes
do
find Documents -name "$type"
done

einfach aber funktioniert :)

2
mnrl

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 '{}' +
1
Adobe
find MyDir -iname "*.[j][p][g]"
+
find MyDir -iname "*.[b][m][p]"
=
find MyDir -iname "*.[jb][pm][gp]"
1
user7531934

Wie wäre es mit

ls {*.py,*.html}

Es listet alle Dateien mit den Dateinamen .py oder .html auf

0
Dr_Hope

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" 
0
Chetabahana

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.

0
Abdul M Gill