Nein.
Der cp
Der Befehl besitzt nicht die Fähigkeit, seine Argumente als reguläre Ausdrücke zu verarbeiten. Sogar Platzhalter werden nicht behandelt (oder die meisten ausführbaren Dateien); vielmehr werden sie von der Shell gehandhabt.
cp test/* test2/
tatsächlich um bash erweitert wird, und all das cp
wirklich sieht, denn seine Argumente sind cp test/file1 test/file2 test/file3 test2/
(oder was auch immer angemessen ist, basierend auf dem tatsächlichen Inhalt von test/
).
Außerdem finde ich deinen Ausdruck nicht, [^\.php]
, stimmt mit dem überein, was Sie wollen (es stimmt nicht nur mit Dateien überein, die .php
enthalten ).
Wahrscheinlich möchten Sie sich die find
ansehen Dienstprogramm, um eine Liste von Dateien basierend auf regulären Ausdrücken herauszufiltern, und verwenden Sie dann xargs
um die zurückgegebene Dateiliste auf cp
anzuwenden Befehl (vorausgesetzt, find hat keinen eingebauten Handler zum Kopieren von Dateien; ich bin mit dem Tool nicht genau vertraut).
Sie könnten Folgendes versuchen:
find . ! -iregex ".*\.php.*" -exec cp {} /destination/folder/ \;
Diese besagt, das aktuelle Verzeichnis rekursiv nach Dateien zu durchsuchen, die kein ".php" im Pfad enthalten und diese nach /destination/folder/
zu kopieren .
Wie gewünscht, eine genauere Aufschlüsselung der Argumente:
.
- Ort, an dem die Suche gestartet werden soll – in diesem Fall das aktuelle Verzeichnis!
- "Not"-Operator, invertiert das Ergebnis des nächsten Tests-iregex
- Groß-/Kleinschreibungstest für reguläre Ausdrücke. Das nächste Argument ist der Ausdruck.".*\.php.*"
- Regulärer Ausdruck passend zu<Anything>.php<Anything>
- Jede Datei, die irgendwo im Pfad ".php" enthält. (Beachten Sie, auch wenn Sie sich in einem Ordner befinden, der ".php" im Namen enthält, benötigen Sie einen komplexeren Ausdruck, um nur die Dateien abzugleichen)-exec
- Führen Sie einen Befehl aus, wenn die vorhergehenden Tests wahr zurückgeben. Das nächste Argument ist der Befehl, alle restlichen Argumente bis;
werden an den Befehl übergeben. die{}
ist ein spezielles Argument, das den Dateinamen repräsentiert.cp
- Der Befehl find` sollte auf jedem der übereinstimmenden Pfadnamen ausgeführt werden.{}
- Der Pfad zur gefundenen Datei, übergeben ancp
als Argument, damit es weiß, welche Datei kopiert werden soll/destination/folder/
- Argument übergeben ancp
, indem Siecp
sagen wohin es die Datei kopieren soll.\;
- Dies ist der;
Abschlusszeichen, dass-exec
schaut nach. Wir entkommen ihm mit einem\
damit Ihre Shell nicht versucht, es zu analysieren, und es stattdessen als Argument an den Befehl (find
)
Es ist ziemlich schwierig, einen regulären Ausdruck zu schreiben, der auf „Strings passt, die nicht .php
haben ", also sagen wir stattdessen find
um nach Zeichenfolgen zu suchen, die tun enthalten .php
und invertieren Sie dann die Ergebnisse mit !
.
Sie können einige andere Tools von der Konsole aus verwenden, wie grep und xargs.
ls -1 some_folder | egrep 'some_extended_regex' | xargs cp -t destination_folder