Verwenden regulärer Ausdrücke mit cp

11

Dies ist eine einfache Frage. Ich versuche, alle Dateien im aktuellen Verzeichnis, die mit "axis-2" beginnen und mit ".jar" enden, in ein Zielverzeichnis zu kopieren. Nehmen wir an, es ist ~ / MyDirectory. Mein erster Gedanke war, es zu versuchen

cp '^axis2.*jar$' ~/MyDirectory

Aber das funktioniert nicht. Ich bin mir nicht mal sicher, ob ich mit cp reguläre Ausdrücke verwenden kann. Ich habe seit einiger Zeit auch keine regulären Ausdrücke mehr verwendet und meine Syntax könnte völlig falsch sein. Wenn ich diesen CP versuche, wird nur die Fehlermeldung "Keine solche Datei oder kein solches Verzeichnis" ausgegeben. Hat jemand Vorschläge, wie man das macht? Vielen Dank!

Nick Van Hoogenstyn
quelle

Antworten:

15

Die UNIX-Shell verwendet Glob-Muster , keine regulären Ausdrücke. Wenn Sie also Dateinamen abgleichen möchten, die mit beginnen axis2und mit enden .jar, verwenden Sie:

cp axis2*.jar /destination/directory
Riccardo Murri
quelle
Vielen Dank! Ich habe es selbst herausgefunden, aber ich wusste nichts über Glob-Muster, also ist das hilfreich und informativ.
Nick Van Hoogenstyn
7

Wenn Sie GNU findund GNU zur cpVerfügung haben, können Sie reguläre Ausdrücke wie im folgenden Befehl verwenden:

find . -maxdepth 1 -regextype posix-basic -regex '.*/axis2[^/]*jar$' \
       -exec cp -t ~/MyDirectory {} +

Dies kann nützlich sein, wenn weder Glob Pattern noch Bash Extended Glob Pattern Suite Ihren Anforderungen entsprechen.

Enzotib
quelle
0

Ich mag die Regex-Syntax des renamePerl-Skripts (von Robin Barker und Larry Wall) sehr, z.

rename "s/OldFile/NewFile/" OldFile*

OldFile.cund OldFile.hwerden umbenannt NewFile.cund NewFile.hjeweils

Ich wollte einfach genau dasselbe mit einem Kopierbefehl:

copy "s/OldFile/NewFile/" OldFile*

Also habe ich dieses Skript dupliziert und die Umbenennungsanweisung geändert, über die kopiert werden soll File::Copy. Et voila! Ein Kopierbefehl mit Perl-Regex-Syntax: jcward / vopy .

Jeff Ward
quelle