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 -name
keine 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 -regex
Test 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 -name
der -regex
Test 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 fd
Tool:
fd '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'
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.