ところで、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"
私のマシンで最初のコマンドを実行すると、次の警告が表示されます。 :
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文件
方法 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中文网!