ホームページ  >  記事  >  php教程  >  実行中の検索コマンド

実行中の検索コマンド

高洛峰
高洛峰オリジナル
2016-12-14 17:28:301409ブラウズ

ところで、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 までご連絡ください。