cp
を使用して、あるディレクトリから別のディレクトリにファイルのサブセットのみをコピーしようとしていますが、メッセージcp: cannot stat [^\.php]': No such file or directory
。 cp
コマンドのみを使用して正規表現を使用する方法はありますか?
番号
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/
にコピーすることを意味します。
要求に応じて、引数のより具体的な内訳:
.
-検索を開始する場所-この場合、現在のディレクトリ!
-「否定」演算子、次のテストの結果を反転します-iregex
-大文字と小文字を区別しない正規表現テスト。次の引数は式です。".*\.php.*"
-正規表現一致<Anything>.php<Anything>
-パスのどこかに「.php」があるファイル。 (名前に「.php」が含まれているフォルダー内にあることを含め、ファイルのみに一致させるにはより複雑な式が必要になることに注意してください)-exec
-上記のテストでtrueが返された場合にコマンドを実行します。次の引数はコマンドです。;
までの残りのすべての引数がコマンドに渡されます。 {}
は、ファイル名を表す特別な引数です。cp
-一致する各パス名でfind`コマンドを実行する必要があります。{}
-見つかったファイルへのパス。引数としてcp
に渡されるので、コピーするファイルがわかります。/destination/folder/
-cp
に渡される引数。cp
にファイルのコピー先を指示します。\;
-;
が探している-exec
ターミネータです。 \
でエスケープするので、シェルはそれを解析せず、代わりにコマンド(find
)の引数としてフィードします。「.php
を持たない文字列」に一致する正規表現を書くのはかなり難しいので、代わりにfind
にdo.php
を含み、!
で結果を反転します。
Grepやxargsなど、他のいくつかのツールをコンソールから使用できます。
ls -1 some_folder | egrep 'some_extended_regex' | xargs cp -t destination_folder