
Mit dem GNU- find
Befehl (GNU Findutils 4.4.2) kann ein regulärer Ausdruck zum Suchen nach Dateien verwendet werden. Beispiel:
$ find pool -regextype posix-extended -regex ".*/mypackage-([a-zA-Z0-9.]+-[0-9]{1,2})-x86_64.pkg.tar.xz+"
Ist es möglich, dieErfassungsgruppedurch diesen Ausdruck definiert und in einem Argument verwendet -printf
?
Bei einer gefundenen Datei mit dem Namen pool/mypackage-1.4.9-1-x86_64.pkg.tar.xz
möchte ich den 1.4.9-1
Teil in einen printf
Ausdruck einschließen.
Ist das möglich?
Antwort1
Wenn du benutzt
find pool -regextype posix-extended \
-regex ".*/mypackage-([a-zA-Z0-9.]+-[0-9]{1,2})-x86_64\.pkg\.tar\.xz" \
-printf '%f\n' |
grep -Eo '[a-zA-Z0-9.]+-[0-9]{1,2}'
( grep
auch unter der Annahme von GNU) sollte es für jeden Pfad funktionieren. Der reguläre Ausdruck lässt keine Zeilenumbrüche zu, daher gibt es keine Möglichkeit, ihn beispielsweise mit einem Verzeichnis abzugleichen, das einen ähnlichen Namen hat.
Antwort2
Eine Alternative zur guten Antwort von l0b0 (kürzer, aber möglicherweise etwas weniger effizient):
Unter der Annahme eines (neueren) GNU sed
:
find pool -print0 |
sed -znE 's|.*/mypackage-([[:alnum:].]+-[0-9]{1,2})-x86_64\.pkg\.tar\.xz$|\1|p'|
tr '\0' '\n'
Beachten Sie, dass der aufwändige Teil find
das Heruntergehen des Baums ist, was ohnehin erforderlich ist, ob Sie es nun tun -regex
oder nicht. Deshalb führen wir hier sed
stattdessen das Zuordnen und Melden durch.