finden: regulärer Ausdruck im Namen

finden: regulärer Ausdruck im Namen

Angenommen, ich schreibe:

find . -regex "[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"

Dieser Befehl sieht für mich so aus, als ob er funktionieren sollte. Ich habe die verschiedenen Regextype-Optionen und verschiedenen Regex-Formate durchprobiert, aber ich kann diese Art von Regex nicht mit find zum Laufen bringen. Gibt es hier etwas Einfaches, das ich in Bezug auf find und den regulären Ausdrucksparser falsch mache?

Antwort1

Find akzeptiert -namekeine regulären Ausdrücke (dies wurde in der ursprünglichen Version der Frage verwendet). Es akzeptiert Shell-Globs, und das ist kein gültiger Shell-Glob. Sie möchten den -regexTest verwenden, müssen ihm aber auch sagen, dass er erweiterte reguläre Ausdrücke oder eine andere Variante verwenden soll, die die Notationen {N}und versteht foo|bar. Schließlich prüft -nameder -regexTest im Gegensatz zu den gesamten Pfadnamen, sodass Sie etwas wie das Folgende benötigen:

$ find . -regextype posix-extended -regex ".*/[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"
5678-34-56-bar.csv.gz
1234-12-12-foo.csv.gz

Wenn Sie verwenden möchten -name, können Sie Folgendes tun:

find . \( \
       -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-foo.csv.gz" \
    -o -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-bar.csv.gz" \
       \) -printf "%f\n"

Antwort2

Eine weitere Option ist das fdTool:

fd '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'

https://github.com/sharkdp/fd

Antwort3

Wenn Sie sinnvolle Dateinamen haben (zumindest in diesem Ordner), könnten Sie etwas in der Art von

 find . | grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'

Auf diese Weise können Sie von der Vielfalt der Grep-Optionen profitieren.

verwandte Informationen