ホームページ php教程 PHP开发 実行中の検索コマンド

実行中の検索コマンド

Dec 14, 2016 pm 05:28 PM
検索コマンド

ところで、Linux で最も一般的に使用されるコマンドは、awk、grep、vim、find です。今日は find コマンドの使い方を詳しく見ていきます

最初に簡単な例を見てみましょう:

Shell。コード

find . -name "*.java"  # 递归查找当前目录下所有java文件
ログイン後にコピー

その中には、
. 検索パスが現在のディレクトリであることを示します (~/workspace/login など、別のプロジェクト ディレクトリとして指定することもできます)
-name は、ターゲット ファイル名またはディレクトリ名を示します検索 (シェルのワイルドカードが許可されています)

通常、上記のコマンドはすでに使用できます。日常の作業ニーズの 80% を完了しますが、残りの 20% を完了するには、find コマンドをより深く理解する必要があります...

ここで、Test.java と TEST.java という 2 つのファイルを見つける必要があるとします。このとき、どうすればよいでしょうか。
find . -name "Test.java" と find . -name "TEST.java" を 2 回実行するとよいでしょう

結果は正しいですが、もっと簡単な方法はありますか? もちろん、答えは

シェル コード

find . -iname "test.java"   # -iname 与-name参数含义一样,但是忽略大小写
ログイン後にコピー

お気づきですか、もっとエレガントですか...

ここでさらに一歩進んで、~/scripts にある Study という名前のすべてのファイルをリストする必要があるとします。ディレクトリ。どうすればいいでしょうか?

find コマンドを理解する前に、シェルの for ループを使用してディレクトリを再帰的に走査し、見つかった各スタディがファイルであるかどうか (スタディという名前のディレクトリである可能性があります) を判断して出力する必要がある場合があります。確かにファイルの場合、この方法は非常に面倒で異常ですが、find コマンドを理解していれば、たった 1 行で、シェル コード

find ~/scripts -type f -name "study"
ログイン後にコピー

を指定することができます。 -type には、他の一般的に使用されるパラメータ値があります: f-file、d-directory

1. 検索パスの指定方法

2. find 検索の対象タイプ (-type)

3. find で検索するファイル名またはディレクトリ名の指定方法 (-name / -iname)

本当にたくさんありますが、次に進みます。 find コマンドには多くの便利なパラメータもあります。

find コマンドのデフォルトは再帰的検索であり、その検索アルゴリズムは、私たちがよく呼ぶ深さ優先トラバーサルである必要があります (- Depth パラメーターを指定することで幅優先トラバーサル アルゴリズムを指定できます)。ただし、場合によっては、現在のディレクトリ、または再帰的検索の深さを指定できます。このとき何をすべきでしょうか? 2 つの簡単な単語

: 再帰的に検索するときのディレクトリの最大の深さを指定します。 1 の場合は、現在のディレクトリ内のみを検索することを意味します

: 再帰的に検索するときのディレクトリの最小の深さを指定します

それでは、見てみましょう。 2 つの例を見てください (最初は実行しないでください):


シェル コード

find . -name "*.java" -maxdepth 3  
find . -maxdepth 3 -name "*.java"
ログイン後にコピー

これら 2 つのコマンドには違いがないように見えますが、実行時の効果は実際には大きく異なります (特にファイル数が多く、非常に深い場合)ディレクトリ)、または一部のマシンでは、最初の One フォームがまったく実行できません。なぜでしょうか。最初のコマンドは最初にすべての Java ファイルを検索し、次に深さの条件を満たすファイルをフィルターで除外するからです。 , 一方、2 番目のコマンドは、ファイル ツリー全体を再帰的に走査することなく、1 ~ 3 ディレクトリ内のターゲット ファイルを検索するだけなので、非常に効率的です。

私のマシンで最初のコマンドを実行すると、次の警告が表示されます。 :

find: 警告: オプションではない引数 -name の後に -max Depth オプションを指定しましたが、オプションは位置指定されていません (-max Depth は、その前に指定されたテストだけでなく、その後に指定されたテストにも影響します) オプションを他の引数の前に指定してください。



これで、さらに 2 つの強力なツール、max Depth と -min Depth (これら 2 つのパラメータは検索効率と Zhuangbility を向上させることができます) を手に入れることができました。

find コマンドにはいくつかの便利なパラメータもあります
-mtime: file content Last変更時刻
-atime: ファイルの最終アクセス時刻
-ctime: ファイルのメタ情報の最終変更時刻 (ファイルのアクセス許可など)

これらのパラメーターの後には整数値が続く必要があります。例:


シェル コード

find . -mtime 1  -name "*.java"     # 在当前目录下递归查找距离现在整1天修改的java文件  
find . -mtime -1 -name "*.java"     # 在当前目录下递归查找1天内修改的java文件  
find . -mtime +1 -name "*.java"     # 在当前目录下递归查找1天前修改的java文件
ログイン後にコピー

If特定の期間内に変更されたファイルを見つける必要がある場合、これらのコマンドは非常に効果的です (運用と保守に携わる学生は頻繁に使用する必要があります)

言及されているパラメーターが非常に多くあります (-name、-iname、-type、-min Depth 、 -max Depth、-mtime など)、find コマンドについてはすでにご存知だと思います

次に、find コマンドの親友である xargs を見てみましょう

通常、特定の関数を実行する必要があります。見つかったファイルに関するいくつかのアクション。たとえば、特定のプロジェクト ディレクトリで StringUtils を使用するすべての Java ファイルを見つけたいと考えています。


方法 1 は Eclipse 検索を使用できます、方法 2 はスクリプトを作成できます、方法 3 は 1 行だけ...



シェルコード

find ~/worksapce/project -name "*.java" | xargs grep "StringUtils"
ログイン後にコピー

其中:
find ~/worksapce/project -name "*.java" 将会在家目录下workspace/project中递归查找所有java文件
xargs grep "StringUtils" 表示在文件中(find命令查找出的结果集)查找含有StringUtils字样的文件

也许有人一开始会这样写:find ~/worksapce/project -name "*.java" | grep "StringUtils"
这个命令执行将不会产生任何结果,而原因就是因为没有使用xargs!

现在我们就来说说xargs:xargs是用来把输入流转化为参数的命令(默认把输入流中的空白字符譬如"\n"(换行)替换成" "(空格))

Shell代码

$ cat test   
a  
b  
c  
d  
e  
$ cat test | xargs  
a b c d e
ログイン後にコピー

ind命令将查找出的每一个文件名或目录名默认用"\n"分割,然后通过管道 | 作为输入流传递给grep命令,但是grep命令要求输入流必须是参数的形式,譬如:grep "target" file1 file2 所以必须使用xargs重新将输入流转换为参数

说到这里,一些比较严谨的同学也许会说,这样的命令:find ~/worksapce/project -name "*.java" | grep "StringUtils" 是不严谨,不安全的(这里还谈不上不安全,毕竟只是一个grep命令,但要是变成xargs rm -rf 那就危险了),原因就是find命令默认用"\n"分隔结果列表,而xargs会把"\n"转化成空格,所以当文件路径或者文件名含有"\n"这些字符时,就会被错误替换,这时候你在执行个rm -rf ,哦, 卖糕的...

所以我们应该养成好习惯,这样写

Shell代码

find ~/worksapce/project -name "*.java" -print0 | xargs -0 grep "StringUtils"
ログイン後にコピー

print0用'\0'(空字符)分隔结果列表,xargs -0 只会将'\0' 替换成空格,这样就不会出现刚才所说的问题了.... 


关于find命令,我就说到这里,赶紧尝试吧... 

更多Find命令实战相关文章请关注PHP中文网!

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)