web-dev-qa-db-ja.com

Linuxのcpコマンドで正規表現をどのように使用しますか?

cpを使用して、あるディレクトリから別のディレクトリにファイルのサブセットのみをコピーしようとしていますが、メッセージcp: cannot stat [^\.php]': No such file or directorycpコマンドのみを使用して正規表現を使用する方法はありますか?

22
PeanutsMonkey

番号

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を持たない文字列」に一致する正規表現を書くのはかなり難しいので、代わりにfinddo.phpを含み、!で結果を反転します。

30
Darth Android

Grepやxargsなど、他のいくつかのツールをコンソールから使用できます。

ls -1 some_folder | egrep 'some_extended_regex' | xargs cp -t destination_folder
10
0xAF