Heim >php教程 >PHP开发 >Finden Sie den Befehl in Aktion

Finden Sie den Befehl in Aktion

高洛峰
高洛峰Original
2016-12-14 17:28:301451Durchsuche

Die am häufigsten verwendeten Befehle unter Linux sind awk, grep, vim und find. Heute werfen wir einen detaillierten Blick auf die Verwendung des Befehls find

Beginnen wir mit einem einfachen Beispiel:

Shell-Code

find . -name "*.java"  # 递归查找当前目录下所有java文件

Unter ihnen:
Gibt an, dass der Suchpfad das aktuelle Verzeichnis ist (Sie können auch andere Projektverzeichnisse angeben, z. B.: ~/workspace/. login)
-name Gibt den Zieldateinamen oder Verzeichnisnamen der Suche an (Shell-Platzhalter sind zulässig)

Normalerweise kann der obige Befehl 80 % Ihres täglichen Arbeitsbedarfs erledigen, die anderen 20 jedoch erledigen %, Sie müssen mehr über den Befehl find erfahren...

Angenommen, Sie müssen die beiden Dateien Test.java und TEST.java finden. Was sollten Sie zu diesem Zeitpunkt tun?
Vielleicht führen Sie find . -name "Test.java" und find . -name "TEST.java" zweimal aus

Obwohl das Ergebnis korrekt ist, gibt es einen einfacheren Weg? Die Antwort lautet natürlich:

Shell-Code

find . -iname "test.java"   # -iname 与-name参数含义一样,但是忽略大小写

Haben Sie ihn gefunden, ist er eleganter...

Jetzt gehen wir einen Schritt weiter Nehmen wir weiter an, wir müssen auflisten: Wie entferne ich alle Dateien mit dem Namen „study“ im Verzeichnis „~/scripts“?

Bevor Sie den Befehl „find“ verstehen, müssen Sie möglicherweise eine Shell-for-Schleife verwenden, um das Verzeichnis rekursiv zu durchlaufen, und dann feststellen, ob es sich bei jeder gefundenen Studie um eine Datei handelt (es kann sich um ein Verzeichnis mit dem Namen „study If it“) handeln ist tatsächlich Die Datei wird ausgegeben. Diese Methode ist wirklich umständlich und ungewöhnlich, aber wenn Sie den Befehl find verstehen, reicht eine Zeile

aus

unter ihnen Der Parameter -type wird verwendet, um den Zieltyp der Suche anzugeben, f bedeutet normale Dateien, -type hat andere häufig verwendete Parameterwerte: f-Datei, d-Verzeichnis

find ~/scripts -type f -name "study"
Jetzt wissen Sie es bereits :

1. So geben Sie den Suchpfad an
2. So geben Sie den Zieltyp der Suchsuche an (-type)
3. name / -iname)

Das ist eine Menge, aber machen wir weiter. Der Befehl „find“ hat noch viele weitere nützliche Parameter.

Der Suchbefehl verwendet standardmäßig eine rekursive Suche, und sein Suchalgorithmus sollte das sein, was wir oft Tiefendurchquerung nennen (Sie können den Breitendurchquerungsalgorithmus angeben, indem Sie den Parameter - Depth angeben), aber manchmal auch Ich möchte nur im aktuellen Verzeichnis suchen oder die Tiefe der rekursiven Suche angeben. Was soll ich zu diesem Zeitpunkt tun? Zwei einfache Wörter:

-max Depth: Geben Sie die maximale Tiefe des Verzeichnisses während der rekursiven Suche an. Wenn es 1 ist, bedeutet dies, dass nur im aktuellen Verzeichnis gesucht wird.
-min Depth: Geben Sie die minimale Tiefe des Verzeichnisses während an rekursive Suche

Schauen wir uns nun zwei Beispiele an (versuchen Sie noch nicht, sie auszuführen):


Shell-Code

Es scheint nein zu geben Unterschied zwischen diesen beiden Befehlen, aber der Ausführungseffekt ist groß (insbesondere wenn es viele Dateien und sehr tiefe Verzeichnisse gibt), oder das erste Formular kann auf einigen Computern nicht ausgeführt werden Da der erste Befehl zunächst alle Java-Dateien ermittelt und dann die Dateien herausfiltert, die die Tiefenbedingungen erfüllen, ist dies sehr, sehr ineffizient. Der zweite Befehl sucht nur nach der Zieldatei im Verzeichnis 1-3, ohne diese rekursiv zu durchlaufen gesamter Dateibaum, also sehr effizient.

find . -name "*.java" -maxdepth 3  
find . -maxdepth 3 -name "*.java"
Beim Ausführen des ersten Befehls auf meinem Computer wird die folgende Warnung angezeigt:

find: Warnung: Sie haben die Option -max Depth nach einem Nicht-Optionsargument angegeben - Name, aber Optionen sind nicht positionell (-max Depth betrifft sowohl die davor als auch die danach angegebenen Tests).


Nun, Sie haben jetzt zwei weitere in Ihren Händen Sharp-Tools -max Depth und -min Depth (diese beiden Parameter können Ihre Sucheffizienz und Zhuangbility verbessern)

Der Suchbefehl verfügt auch über mehrere nützliche Parameter
-mtime: die letzte Änderungszeit des Dateiinhalts
-atime: die letzte Zugriffszeit der Datei
-ctime: die letzte Änderungszeit der Dateimetainformationen (z. B. Dateiberechtigungen)

Diesen Parametern muss ein ganzzahliger Wert folgen, z. B.:


Shell-Code


Wenn Sie geänderte Dateien innerhalb eines bestimmten Zeitraums finden müssen, sind diese Befehle sehr effektiv (Schüler, die sich mit Betrieb und Wartung befassen, sollten sie häufig verwenden). )

Nachdem Sie so viele Parameter gesagt haben (-name, -iname, -type, -min Depth, -max Depth, -mtime usw.), müssen Sie den Befehl „find“ einigermaßen verstehen Schauen Sie sich einen der Suchbefehle an. Guter Freund----xargs

find . -mtime 1  -name "*.java"     # 在当前目录下递归查找距离现在整1天修改的java文件  
find . -mtime -1 -name "*.java"     # 在当前目录下递归查找1天内修改的java文件  
find . -mtime +1 -name "*.java"     # 在当前目录下递归查找1天前修改的java文件
Normalerweise müssen wir bestimmte Aktionen für die gefundenen Dateien ausführen. Ich möchte beispielsweise alle Java-Dateien finden, die StringUtils in einem verwenden Bestimmtes Projektverzeichnis. Was soll ich zu diesem Zeitpunkt tun?


Methode 1 können wir die Eclipse-Suche verwenden, Methode 2 können wir ein Skript schreiben, Methode 3 nur eine Zeile...



Shell-Code

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中文网!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn