Nein.
Der cp
Befehl kann keine seiner Argumente als reguläre Ausdrücke verarbeiten. Sogar Platzhalter werden von ihm (oder den meisten ausführbaren Dateien) nicht verarbeitet. Vielmehr werden sie von der Shell gehandhabt.
cp test/* test2/
wird tatsächlich durch bash erweitert, und alles, was cp
wirklich für seine Argumente cp test/file1 test/file2 test/file3 test2/
spricht, ist (oder was auch immer angemessen ist, basierend auf dem tatsächlichen Inhalt von test/
).
Ich glaube auch nicht, dass Ihr Ausdruck [^\.php]
mit dem übereinstimmt, was Sie möchten (er stimmt nicht nur mit Dateien überein, die enthalten .php
).
Sie möchten sich wahrscheinlich das find
Dienstprogramm ansehen , um eine Liste der Dateien basierend auf regulären Ausdrücken herauszufiltern und dann xargs
die zurückgegebene Dateiliste auf den cp
Befehl anzuwenden (vorausgesetzt, find hat keinen eingebauten Handler zum Kopieren von Dateien; I ' Ich bin mit dem Werkzeug nicht vertraut.
Sie könnten versuchen:
find . ! -iregex ".*\.php.*" -exec cp {} /destination/folder/ \;
Dies besagt, dass das aktuelle Verzeichnis rekursiv nach Dateien durchsucht werden soll, die nicht ".php" im Pfad enthalten, und diese in das Verzeichnis kopiert werden sollen /destination/folder/
.
Wie gewünscht, eine genauere Aufschlüsselung der Argumente:
.
- Ort, an dem die Suche gestartet werden soll - in diesem Fall das aktuelle Verzeichnis
!
- Operator "Nicht" invertiert das Ergebnis des nächsten Tests
-iregex
- Test auf reguläre Ausdrücke ohne Berücksichtigung der Groß- und Kleinschreibung. Das nächste Argument ist der Ausdruck.
".*\.php.*"
- Übereinstimmung mit regulären Ausdrücken <Anything>.php<Anything>
- Jede Datei, die irgendwo im Pfad ".php" enthält. (Beachten Sie, dass Sie, auch wenn Sie sich in einem Ordner befinden, dessen Name ".php" enthält, einen komplexeren Ausdruck benötigen, um nur mit den Dateien übereinzustimmen.)
-exec
- Führen Sie einen Befehl aus, wenn die vorhergehenden Tests true zurückgeben. Das nächste Argument ist der Befehl. Alle verbleibenden Argumente ;
werden an den Befehl übergeben. das {}
ist ein besonderes Argument , die die Dateinamen.
cp
- Der Befehl "find" sollte für jeden übereinstimmenden Pfadnamen ausgeführt werden.
{}
- Der Pfad zu der gefundenen Datei wird cp
als Argument übergeben, damit bekannt ist, welche Datei kopiert werden soll
/destination/folder/
- Argument, das an übergeben wird cp
und angibt, cp
wohin die Datei kopiert werden soll.
\;
- Dies ist der ;
Terminator, der -exec
gesucht wird. Wir schließen es mit einem, \
damit Ihre Shell nicht versucht, es zu analysieren, sondern es stattdessen als Argument an den Befehl ( find
) weiterleitet.
Es ist ziemlich schwierig , einen regulären Ausdruck zu schreiben , die „Strings , die nicht haben übereinstimmt .php
“, so dass wir stattdessen sagen find
für Strings suchen , die sie enthalten , .php
mit und dann umkehren die Ergebnisse !
.
find . -name [^\.php] -exec cp {} /path/to/location \;
Vorsicht bei Dateien mit Sonderzeichen.