grep
。cp
たぶん私が使用する方法が異なるかもしれません。
この点でgrep
「再帰」は異なって解釈されるようですcp
。そうですか? (私の質問)
私の言葉によると質問SOでこれを探しています...
一致する文字列を含むファイルの場合grep
:
./file1.js
./file2.php
./inc/file3.js
./inc/file4.php
./inc.php/file5.php
grep -R "find me" *.php
返品:
./file2.php
./inc.php/file5.php
... grep
".php"を含むディレクトリとファイルを一致させようとしているからです。
ただし、cp
再帰コピーを使用している場合は、次のように言います。
cp -r inc/* ~/mywork/
名前に「inc」が含まれているかどうかにかかわらず、隠しファイルではありませんが、「inc」フォルダのファイルとすべてのディレクトリなどがコピーされます。
grep
「再帰」の意味と意味が異なるのですかcp
、それとも「再帰」を同じように扱いますか?他のパス/ファイルパラメータが同じ方法でどのように解釈されるかを理解するのに役立ちますかcp
?grep
答え1
注文grep
、
grep -R "find me" *.php
...ファイル名のグロービングパターンが含まれています。*.php
.これは実行前にシェルによって拡張されるため、実行されると実際grep
のコマンドは次のようになります。
grep -R "find me" file1.php file2.php inc.php
...これはinc.php
ディレクトリ名です。
その後、grep
ユーティリティは提供されたファイルからユーザーが提供した式を検索します。コマンドラインに記載されているディレクトリを検索します。みんな内容が式と一致するファイルディレクトリの下のファイルとサブディレクトリ。つまりinc.php/subdir/README
、ファイルに文字列が含まれている場合は、一致するものを見つけることができますfind me
。
簡単に言えば、与えられたオプションに従ってコマンドラインで指定された各名前を(再帰的に)処理します(その中の一致する行を検索します)。
このcp
コマンドは再帰操作と同じように機能します。
cp -r inc/* ~/mywork/
シェルは上記のコマンドを次のように拡張します。
cp -r inc/file1 inc/file2 inc/dir1 inc/dir2 /home/myself/mywork/
その後、ユーティリティはcp
個別に名前が付けられた各ファイルまたはディレクトリをコピー先ディレクトリに繰り返しコピーします。
つまり、コマンドラインで指定されたすべての名前は、指定されたオプションに従って処理(ターゲットにコピー)(再帰的)されます。
その他の注意:
再帰検索サポートは
grep
非標準拡張です。ダッシュで始まる名前に拡張できるファイル名ワイルドカードパターンは、コマンドラインオプションとの混同を避けるために慎重に処理する必要があります。
grep
したがって、あなたのコマンドは、次のように、より安全に作成されます。grep -R -- "find me" *.php
または
grep -R -e "find me" -- *.php
...
--
オプションとその引数をオプションではなくオペランドと区切ります。ワイルドカードパターンが文字列で始まる項目に拡張されることが保証されるため、あなたのcp
コマンドにはこの問題はありませんinc/
。