回答:
いや
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
、その後で結果を反転!
。
cp
他のバイナリが正規表現を展開できないことに気づきませんでした。あなたが与えたサンプルの例でオプションと引数のそれぞれが何を意味するかを詳しく説明してもいいですか?私は知っている.
、現在のディレクトリを指しますが何をすべきか!
、{}
、\;
、など、彼らが何を意味するか、同様に参照してください?たとえば、なぜエスケープする必要があるの;
ですか?
find . -name '[^\.txt]' -exec rm {} \;
それで私の命令は私が使うことに抵抗したfind
。おそらく私の側の間違いですが、私が何を間違えたかはわかりません。私の理解で{}
は、コマンドで見つかった各ファイルを参照している限りfind . -name '[^\.txt]'
grepやxargsなど、コンソールから他のいくつかのツールを使用できます。
ls -1 some_folder | egrep 'some_extended_regex' | xargs cp -t destination_folder
{}
違うの-t
?
find . -name [^\.php] -exec cp {} /path/to/location \;
特殊文字を含むファイルには注意してください。