Linux에서 가장 일반적으로 사용되는 명령은 awk, grep, vim 및 find입니다. 오늘은 find 명령의 사용법을 자세히 살펴보겠습니다.
간단한 예부터 살펴보겠습니다. >
find . -name "*.java" # 递归查找当前目录下所有java文件
. 검색 경로가 현재 디렉터리임을 나타냅니다(~/workspace/와 같은 다른 프로젝트 디렉터리를 지정할 수도 있습니다). login)
-name 검색 대상 파일 이름 또는 디렉터리 이름을 나타냅니다(셸 와일드카드 허용)
일반적으로 위 명령은 일일 작업 요구 사항의 80%를 완료할 수 있지만 나머지 20%를 완료하려면 %, find 명령에 대해 자세히 알아보아야 합니다...
이제 Test.java와 TEST.java 두 파일을 찾아야 한다고 가정해 보겠습니다.
find .-name "Test.java"를 실행하고 find .-name "TEST.java"를 두 번 실행하게 될 수도 있습니다.
결과는 정확하지만 더 쉬운 방법이 있습니까? 답은 역시
find . -iname "test.java" # -iname 与-name参数含义一样,但是忽略大小写
이제 한 발짝 나아갑니다 더 나아가, ~/scripts 디렉토리에서 Study라는 이름의 모든 파일을 제거하는 방법을 나열해야 한다고 가정해 보겠습니다. <… 과연 파일이 출력됩니다. 그러고보니 이 방법은 정말 번거롭고 특이한데 find 명령을 이해하면
쉘 코드
그 중 -type 매개변수는 검색 대상 유형을 지정하는 데 사용되며, f는 일반 파일을 의미하고, -type에는 일반적으로 사용되는 다른 매개변수 값이 있습니다: f-file, d-directory
find ~/scripts -type f -name "study"
1. 찾기 검색 경로 지정 방법
2. 찾기 검색 대상 유형 지정 방법(-type)
3. 찾기 검색 경로 지정 방법(-) name / -iname)
내용이 많지만 계속해서 find 명령에 더 많은 유용한 매개변수가 있습니다.
find 명령의 기본값은 재귀 검색이며 해당 검색 알고리즘은 흔히 깊이 우선 순회라고 부르는 것이어야 합니다(-깊이 매개변수를 지정하여 너비 우선 순회 알고리즘을 지정할 수 있음). 현재 디렉터리에서만 검색하고 싶거나, 재귀 검색의 깊이를 지정할 수 있으면 어떻게 해야 합니까? 간단한 두 단어
-maxlength: 재귀 검색 시 디렉터리의 최대 깊이를 지정합니다. 1이면 현재 디렉터리에서만 검색한다는 의미입니다.
-minlength: 재귀 검색 시 디렉터리의 최소 깊이를 지정합니다. 재귀 검색
이제 두 가지 예를 살펴보겠습니다(아직 실행하지 마세요).
쉘 코드
없는 것 같습니다. 이 두 명령의 차이점은 있지만 실행 효과는 정확합니다(특히 파일이 많고 디렉터리가 매우 깊은 경우). 또는 일부 컴퓨터에서는 첫 번째 양식을 실행할 수 없습니다.
find . -name "*.java" -maxdepth 3 find . -maxdepth 3 -name "*.java"
내 컴퓨터에서 첫 번째 명령을 실행할 때 다음 경고가 나타납니다.
find: 경고: 옵션이 아닌 인수 뒤에 -maxlength 옵션을 지정했습니다. 이름이지만 옵션은 위치에 영향을 받지 않습니다(-maxlength는 이전에 지정된 테스트와 이후에 지정된 테스트에 영향을 미칩니다).
이제 두 가지 인수가 더 남았습니다. 날카로운 도구 -maxlength 및 -minlength(이 두 매개변수는 검색 효율성과 Zhuangbility를 향상시킬 수 있습니다)
find 명령에는 여러 유용한 매개변수도 있습니다.
-mtime: 파일 콘텐츠의 마지막 수정 시간
-atime: 파일의 마지막 액세스 시간
-ctime: 파일 메타 정보(예: 파일 권한)의 마지막 수정 시간
이 매개변수 뒤에는 정수 값이 와야 합니다. 예:
셸 코드
일정 기간 내에 수정된 파일을 찾아야 하는 경우 이 명령이 매우 효과적입니다. (운영 및 유지 관리에 종사하는 학생은 자주 사용해야 합니다.) )
find . -mtime 1 -name "*.java" # 在当前目录下递归查找距离现在整1天修改的java文件 find . -mtime -1 -name "*.java" # 在当前目录下递归查找1天内修改的java文件 find . -mtime +1 -name "*.java" # 在当前目录下递归查找1天前修改的java文件
이제 살펴보겠습니다. 찾기 명령 중 하나를 살펴보십시오. Good friend----xargs
일반적으로 발견된 파일에 대해 특정 작업을 수행해야 합니다. 예를 들어, StringUtils를 사용하는 모든 Java 파일을 찾고 싶습니다. 특정 프로젝트 디렉토리에서 어떻게 해야 합니까?
방법 1은 eclipse 검색을 사용할 수 있고, 방법 2는 스크립트를 작성할 수 있으며, 방법 3은 한 줄만 사용할 수 있습니다...
쉘 코드
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中文网!