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


22

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

回答:


29

いや

cpこのコマンドは、正規表現とその引数のいずれかを処理する能力を持ちません。ワイルドカードでも処理されません(またはほとんどの実行可能ファイル)。むしろ、それらはシェルによって処理されます。

cp test/* test2/はbashによって実際に展開されcp、その引数について実際に見るcp test/file1 test/file2 test/file3 test2/ものはすべて(またはの実際の内容に基づいて適切なものtest/)です。

また、あなたの表現が[^\.php]あなたが望むものと一致するとは思いません(を含むファイルだけとは一致しません.php)。

おそらくfindユーティリティを調べて、正規表現に基づいてファイルのリストをフィルターで除外しxargs、返されたファイルリストをcpコマンドに適用するために使用します(findにはファイルをコピーするための組み込みハンドラーがないと仮定します; I ' mこのツールに精通していない)。

あなたが試すかもしれません:

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文字列を検索する含まれて.php、その後で結果を反転!


2
find . -name [^\.php] -exec cp {} /path/to/location \;特殊文字を含むファイルには注意してください。
ロブ

@Darth Android-ありがとう。cp他のバイナリが正規表現を展開できないことに気づきませんでした。あなたが与えたサンプルの例でオプションと引数のそれぞれが何を意味するかを詳しく説明してもいいですか?私は知っている.、現在のディレクトリを指しますが何をすべきか!{}\;、など、彼らが何を意味するか、同様に参照してください?たとえば、なぜエスケープする必要があるの;ですか?
PeanutsMonkey

@Rob-特殊ファイルとはどういう意味ですか?
PeanutsMonkey

@Rob-同様の式を使用して特定のファイルを削除しようとしましたが、最終的にディレクトリ内のすべてのファイルが削除されました。find . -name '[^\.txt]' -exec rm {} \;それで私の命令は私が使うことに抵抗したfind。おそらく私の側の間違いですが、私が何を間違えたかはわかりません。私の理解で{}は、コマンドで見つかった各ファイルを参照している限りfind . -name '[^\.txt]'
-PeanutsMonkey

正規表現と何を一致させようとしていますか?
ロブ

10

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

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

それとどう{}違うの-t
PeanutsMonkey

2
この場合はあまりありません。xargsの代替構文は「xargs cp {} destination_folder」です。標準のcp構文は、1つまたは複数のソースと最後に1つの宛先を取ります。-tオプションを使用する場合、-tの後に宛先を指定し、ソースに残りの行を使用できます。この場合、-tオプションの方が便利だと思います。他の例では、{}はxargs(stdin)にパイプされるもの、この場合はファイル名に置き換えられます。
0xAF

-1

使いやすい次のコマンドを実行できます。

find /home/usr/search_dir -iname *file_name_portion*.txt | xargs cp -t /home/usr/destination_folder

かっこいい!!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.