いいえ
cp
コマンドには、その引数を正規表現として処理する機能がありません。ワイルドカードでさえ、それ(またはほとんどの実行可能ファイル)によって処理されません。むしろ、それらはシェルによって処理されます。
cp test/* test2/
実際にはbashによって展開され、そのすべて cp
その引数が cp test/file1 test/file2 test/file3 test2/
であることを実際に確認します (または test/
の実際の内容に基づいて適切なもの ).
また、あなたの表現 [^\.php]
とは思えません 、あなたが望むものに一致します(.php
を含むファイルだけに一致するわけではありません ).
おそらく find
を調べたいと思うでしょう。 正規表現に基づいてファイルのリストを除外するユーティリティで、 xargs
を使用します 返されたファイル リストを cp
に適用します。 コマンド (find にはファイルをコピーするための組み込みハンドラーがないと仮定します。私はこのツールに詳しくありません)。
試してみてください:
find . ! -iregex ".*\.php.*" -exec cp {} /destination/folder/ \;
これは、パスに「.php」を含まないファイルを現在のディレクトリで再帰的に検索し、それらを /destination/folder/
にコピーすることを示しています。 .
要求に応じて、引数のより具体的な内訳:
.
- 検索を開始する場所 - この場合、現在のディレクトリ!
- "Not" 演算子、次のテストの結果を反転-iregex
- 大文字と小文字を区別しない正規表現テスト。次の引数は式です。".*\.php.*"
-<Anything>.php<Anything>
に一致する正規表現 - パスのどこかに「.php」が含まれるファイル。 (名前に「.php」を含むフォルダー内にあることを含め、ファイルのみを一致させるには、より複雑な式が必要になることに注意してください)-exec
- 上記のテストで true が返された場合にコマンドを実行します。次の引数はコマンドで、残りの引数はすべて;
までです コマンドに渡されます。{}
ファイル名を表す特別な引数です。cp
- find` コマンドは、一致した各パス名で実行する必要があります。{}
-cp
に渡された、見つかったファイルへのパス コピーするファイルを知るための引数として/destination/folder/
-cp
に渡される引数 、cp
に伝えます ファイルのコピー先\;
- これは;
です-exec
というターミネータ を探している。\
でエスケープします シェルがそれを解析しようとせず、代わりにコマンドの引数としてフィードするようにします (find
)
「.php
を持たない文字列」にマッチする正規表現を書くのはかなり難しい "なので、代わりに find
と伝えます する文字列を検索する .php
を含む !
で結果を反転します .
grep や xargs など、コンソールから他のいくつかのツールを使用できます。
ls -1 some_folder | egrep 'some_extended_regex' | xargs cp -t destination_folder