개요
때때로 시스템에서 특정 특성(예: 파일 권한, 파일 소유자, 파일 길이, 파일 형식 등)을 가진 파일을 찾아야 할 수도 있습니다. 여기에는 여러 가지 이유가 있을 수 있습니다. 보안상의 이유일 수도 있고, 일반적인 시스템 관리 작업일 수도 있고, 어딘가에 저장된 파일을 찾기 위한 것일 수도 있습니다. find는 특정 파일이나 디렉토리를 찾기 위해 현재 디렉토리나 전체 파일 시스템을 탐색할 수 있는 매우 효과적인 도구입니다.
find에는 강력한 기능이 있기 때문에 많은 옵션도 있으며 대부분은 시간을 들여 이해할 가치가 있습니다. 시스템에 NFS(네트워크 파일 시스템)가 포함되어 있더라도 해당 권한이 있는 한 find 명령은 파일 시스템에서도 유효합니다.
리소스를 많이 소모하는 find 명령을 실행할 때 대용량 파일 시스템을 순회하는 데 시간이 오래 걸릴 수 있기 때문에 많은 사람들이 백그라운드에서 실행하는 경향이 있습니다(여기서는 30G 바이트 시스템 이상의 파일을 나타냅니다).
find 사용 명령
경로 이름 찾기 -options [-print -exec -ok]
find 명령의 일반적인 형식은 다음과 같습니다.
find [-H] [-L] [-P] [path...] [expression]
여기서 '-H' '-L' '- 세 가지 P' 옵션은 주로 기호 링크를 처리하는 데 사용됩니다. '-H'는 명령줄에 지정된 기호 링크만 따르는 것을 의미합니다. '-L'은 모든 기호 링크를 따르는 것을 의미합니다. 이는 아니오를 의미합니다. 심볼릭 링크를 따르십시오.
예를 들어, 현재 디렉토리에 심볼릭 링크 e1000이 있고 이제 파일 이름의 마지막 문자가 숫자인 소스 파일을 찾으려면
$ find -H -name "* [0-9 ].c" -print
./2234.c
위와 같이 작성하면 현재 디렉토리에서 요구사항을 만족하는 파일만 찾을 수 있고, e1000 이하의 파일은 찾을 수 없습니다. 따라서 다음과 같이 작성할 수 있습니다:
$ find -H e1000 . -name "*[0-9].c" -print
또는 '-L' 옵션을 사용
$ find -L " * [0-9].c" -print
형식의 [path...] 부분은 이 디렉터리가 검색할 루트 디렉터리로 사용됨을 나타냅니다.
형식의 [표현식]은 표현식입니다. 가장 기본적인 표현식은 설정 항목(옵션), 테스트 항목(테스트), 동작 항목(액션)의 세 가지 범주로 구분됩니다. 이 세 가지 범주는 논리 연산자(연산자)를 통해 결합되어 더 크고 복잡한 표현식을 구성할 수 있습니다. 방법. 설정 항목(예: -length, -maxlength 등)은 특정 파일에만 적용되는 것이 아니라 이 검색 작업에만 적용됩니다. 테스트 항목(테스트)에 대해 일치 테스트를 수행합니다. -name, -num, -user 등과 같은 특정 파일은 true 또는 false를 반환합니다. 작업 항목(작업)은 특정 파일에 대해 일부 작업(-print와 같은 가장 일반적인 작업)을 수행하고 true 또는 false를 반환합니다.
find를 강력하게 만드는 것은 [표현] 부분의 풍부함입니다. 이 부분은 좀 더 복잡해서 나중에 설명하겠습니다.
find 명령 옵션
find 명령에는 많은 옵션이나 표현식이 있으며, 각 옵션 앞에는 대시(-)가 붙습니다. 먼저 이 명령의 기본 옵션을 살펴보고 몇 가지 예를 들어보겠습니다.
-name 파일 이름으로 파일을 검색합니다.
-perm 파일 권한에 따라 파일을 찾습니다. -user 소유자에 따라 파일을 검색합니다.
-group 파일이 속한 그룹에 따라 파일을 찾습니다.
-mtime -n 또는 +n은 변경 시간을 기준으로 파일을 검색합니다. -n은 파일이 지금부터 n일 이내에 변경되었음을 나타내고, +n은 파일이 n일 전부터 변경되었음을 나타냅니다. find 명령에는 -atime 및 -ctime 옵션도 있지만 -mtime 옵션과 유사하므로 여기서는 -mtime 옵션만 소개합니다.
-nogroup 파일이 속한 유효한 그룹이 없는 파일, 즉 파일이 속한 그룹이 /etc/groups에 존재하지 않는 파일을 찾습니다.
-nouser 유효한 소유자가 없는 파일을 검색합니다. 즉, 파일 소유자가 /etc/password에 존재하지 않습니다.
-newer file1 !file2 변경 시간이 file1보다 최신이지만 file2보다 오래된 파일을 찾습니다.
-type 다음과 같은 특정 유형의 파일을 찾습니다.
b - 블록 장치 파일입니다.
d - 디렉토리.
c - 캐릭터 장치 파일.
p - 파이프 파일.
l - 심볼릭 링크 파일.
f - 일반 파일.
-size n[c] 파일 길이가 n 블록인 파일을 검색합니다. c가 포함되면 파일 길이는 바이트 단위로 측정됩니다.
-깊이 파일을 검색할 때 먼저 현재 디렉터리에서 파일을 검색한 다음 하위 디렉터리에서 검색합니다.
-fstype 특정 유형의 파일 시스템에 있는 파일을 찾습니다. 이러한 파일 시스템 유형은 일반적으로 구성 파일 /etc/fstab에서 찾을 수 있습니다. 이 구성 파일에는 이 시스템의 파일 시스템에 대한 정보가 포함되어 있습니다.
-mount는 파일을 검색할 때 파일 시스템 마운트 지점을 넘지 않습니다.
-follow find 명령이 심볼릭 링크 파일을 발견하면 링크가 가리키는 파일을 따릅니다.
-cpio 일치하는 파일에 대해 cpio 명령을 사용하여 해당 파일을 테이프 장치에 백업합니다.
이름 옵션 사용
파일 이름 옵션은 find 명령에서 가장 일반적으로 사용되는 옵션입니다. 이 옵션은 단독으로 사용되거나 다른 옵션과 함께 사용됩니다. 파일 이름 패턴을 사용하여 파일을 일치시킬 수 있습니다. 파일 이름 패턴을 따옴표로 묶어야 합니다.
현재 경로에 관계없이 루트 디렉터리 $HOME에서 *.txt와 일치하는 파일 이름을 가진 파일을 찾으려면 ~를 경로 이름 매개 변수로 사용하고 물결표 ~는 $HOME 디렉터리를 나타냅니다.
$ find ~ -name "*.txt" -print
현재 디렉터리와 하위 디렉터리에 있는 모든 '*.txt' 파일을 찾으려면 다음을 사용할 수 있습니다.
$ find -name "* .txt " -print
원하는 현재 디렉터리와 하위 디렉터리에서 파일 이름이 대문자로 시작하는 파일을 찾으려면 다음을 사용할 수 있습니다.
$ find . -name "[A-Z]*" -print
파일 이름이 h o s t로 시작하는 /etc 디렉토리에서 파일을 찾으려면 다음을 사용할 수 있습니다.
$ find /etc -name "host*" -print
현재 디렉토리에서 이름이 다음과 같은 파일을 찾으려면 두 개의 소문자로 시작하고 그 뒤에 두 개의 숫자가 오고 마지막으로 *.t x t의 파일
이 오는 경우 다음 명령은 ax37.txt라는 파일을 반환할 수 있습니다.
$ find -name "[a-z] [a-z][ 0--9][0--9].txt" -print
perm 옵션 사용
파일 권한 모드에 따라 파일을 찾으려면 -perm 옵션을 사용하면 됩니다. . 모든 사용자가 실행 권한을 갖고 있는 파일을 찾거나 사용자 디렉터리에서 파일 권한 유형을 확인해야 할 수도 있습니다. 이 옵션을 사용할 때는 권한에 8진수 표기법을 사용하는 것이 가장 좋습니다. 현재 디렉터리에서 파일 권한 비트가 7 5 5인 파일, 즉 파일 소유자가 읽고 쓰고 실행할 수 있고 다른 사용자가 읽고 실행할 수 있는 파일을 찾으려면 다음을 사용하면 됩니다.
$ find . -perm 755 -print 논리 연산자
find의 논리 연산자는 주로 다음과 같습니다. 우선순위가 높은 것부터 낮은 것 순으로:
(expr)
괄호가 가장 높습니다. 우선순위, 괄호 안의 값은
! expr
의 평가로 expr 표현식의 값을 무효화합니다.
-not expr
위와 동일하지만 POSIX는
expr1을 지원하지 않습니다. 연산자가 없는 expr2
는 둘 사이에 "and"를 추가하는 것과 같습니다. 즉 AND 연산은 두 표현식 값이 모두 true인 경우에만 true를 반환합니다. expr1 표현식이 먼저 평가됩니다. false인 경우 expr2는 평가되지 않습니다.
expr1 -a expr2
위와 동일
expr1 -and expr2
위와 동일하지만 POSIX는 지원하지 않습니다.
expr1 -o expr2
는 해당 값을 OR하는 것을 의미합니다. expr1과 expr2 두 표현식은 왼쪽과 오른쪽 값 중 하나가 true이면 전체 표현식이 true입니다. expr1 표현식이 먼저 평가됩니다. true인 경우 expr2는 평가되지 않습니다.
expr1 -or expr2
위와 동일하지만 POSIX는
expr1 , expr2
쉼표 표현을 지원하지 않습니다. expr1과 expr2가 모두 평가되지만 expr2의 값만 반환됩니다. expr1의 값은 삭제됩니다
prune 옵션 사용
-prune은 액션 항목으로, 해당 파일이 디렉터리 파일일 경우 검색을 위해 이 디렉터리를 입력하지 말라는 의미입니다. -prune 액션을 이해하려면 먼저 find 명령의 검색 규칙(find 명령의 알고리즘이라고도 할 수 있음)을 이해해야 합니다.
find 명령은 지정된 디렉터리 트리를 재귀적으로 탐색하고 각 파일에 대해 find 명령의 표현식을 순서대로 실행합니다. 표현식은 먼저 논리 연산자에 따라 결합된 다음 표현식이 왼쪽에서 오른쪽으로 평가됩니다. 설명을 위해 다음 코드를 예로 듭니다
find PATHP1 OPT1 TEST1 ACT1 (TEST2 or TEST3) ACT2
1. OPT1 설정 항목이 없는 경우 find 명령의 전체 설정을 수행합니다. 항목에서 다음 단계를 순서대로 수행합니다
2. 파일 변수 File = PATHP1
3. 실행 결과가 false인 경우 (8)로 이동합니다.
4. File 파일에 대해 ACT1 작업을 수행하고, 실행 결과가 false이면 (8)
5로 이동하고, File 파일에 대해 TEST2 테스트를 수행하면 (7)
6으로 이동합니다. File 파일에 대해 TEST3 테스트를 수행합니다. 실행 결과가 false인 경우 (8)
7. File 파일에 대해 ACT2 작업을 수행합니다
8. -작업을 수행하고 이 디렉터리를 입력합니다
9. 현재 디렉터리에 파일이 있습니까? 그렇다면 파일 하나를 차례로 가져와서 (3)으로 이동합니다. 현재 디렉터리는 PATHP1이면 프로그램이 종료되고, 그렇지 않으면 이전 디렉터리로 돌아가서 (9)로 이동합니다.
위의 과정을 이해하고 나면 다음 코드가 '' 하나만 출력하는 이유를 이해하는 것은 어렵지 않습니다. .'
$ find . -prune
.
그리고 현재 디렉터리에는 4090바이트보다 큰 파일이 2개 있으며, 다음과 같이 4096바이트보다 큰 파일이 하나만 있습니다.
$ find . -size +4090c -print
.
./a_book_of_c.chm
$ find . -size +4096c -print
./a_book_of_c.chm
그러므로 위의 두 개를 교체하세요. -print와 -prune을 함께 사용하면 이 두 명령은 무엇을 출력합니까?
$ find . -size +4090c -prune
.
$ find . -size +4096c -prune
./a_book_of_c.chm
-prune은 -path 또는 -wholename과 함께 사용되는 경우가 많습니다. , 특정 디렉토리를 피하려면 일반적인 형식은 다음과 같습니다.
$ find PATH (-path <이 경로 #1을 원하지 않음> -o -path <이 경로 #2를 원하지 않음>) - 정리 -o -path <내가 원하는 전역 표현식>
$ find . -size +0c -wholename "*e*[0-9]*" -o ! /( -name "." -o - name "*phone" /) -prune -name "*.c" -user xixi -o -name "*phone"
파일을 찾을 때 디렉토리를 무시하려는 경우, 자신이 해당 디렉토리에 없다는 것을 알고 있기 때문입니다. 디렉토리 파일을 찾으려면 -prune 옵션을 사용하여 무시해야 하는 디렉토리를 지정할 수 있습니다. -prune 옵션을 사용할 때는 주의하십시오. -length 옵션도 함께 사용하는 경우 find 명령에서 -prune 옵션이 무시되기 때문입니다.
/apps 디렉토리에서는 파일을 찾고 /apps/bin 디렉토리에서는 찾지 않으려는 경우 다음을 사용할 수 있습니다.
$ find /apps -name "/apps/bin" -prune -o -print
사용자 및 nouser 옵션 사용
파일 소유자에 따라 파일을 찾으려면 해당 사용자 이름을 지정할 수 있습니다. 예를 들어, $HOME 디렉토리에서 소유자가 dave인 파일을 찾으려면 다음을 사용할 수 있습니다.
$ find ~ -user dave -print
를 사용하여 /etc 디렉토리에서 소유자가 uucp인 파일을 찾을 수 있습니다.
$ find /etc -user uucp -print
소유자 계정이 삭제된 파일을 찾으려면 -nouser 옵션을 사용할 수 있습니다. 이렇게 하면 /etc/password 파일에서 소유자가 유효한 계정을 갖고 있지 않은 파일을 찾을 수 있습니다. -nouser 옵션을 사용할 때는 사용자 이름을 제공할 필요가 없습니다. find 명령
이 자동으로 작업을 수행합니다. 예를 들어 /home 디렉토리에서 해당 파일을 모두 찾으려면 다음을 사용할 수 있습니다.
$ find /home -nouser -print
group 및 nogroup 옵션 사용
user 및 nouser와 마찬가지로 옵션, 파일용 find 명령에는 해당 명령이 속한 사용자 그룹에 대한 동일한 옵션도 있습니다. /apps 디렉토리에서 accts 사용자 그룹에 속하는 파일을 찾으려면 다음을 사용할 수 있습니다.
$ find /apps -group accts -print
유효한 파일을 찾으려면 사용자 그룹에 속한 모든 파일에 대해 nogroup 옵션을 사용할 수 있습니다. 아래 find 명령은 파일 시스템의 루트 디렉터리에서 해당 파일을 찾습니다.
$fine / -nogroup -print
변경 시간으로 파일 찾기
변경 시간으로 파일을 찾으려면 다음을 사용할 수 있습니다. mtime 옵션. 시스템의 여유 공간이 갑자기 부족해지면 이 기간 동안 특정 파일의 길이가 급격히 늘어났을 가능성이 높습니다. 이 경우 mtime 옵션을 사용하여 해당 파일을 찾을 수 있습니다. 지금부터 n일 이내에 변경된 파일을 제한하려면 빼기 기호 -를 사용하고, n일 전에 변경된 파일을 제한하려면 더하기 기호 +를 사용합니다.
시스템 루트 디렉토리에서 변경 시간이 5일 이내인 파일을 찾으려면 다음을 사용하세요.
$ find / -mtime -5 -print
변경 시간이 3일 이내인 파일을 찾으려면 다음을 사용하세요. /var/adm 디렉토리에서 30일이 지난 파일의 경우 다음을 사용할 수 있습니다.
$ find /var/adm -mtime +3 -print
최신 옵션을 사용하세요
변경 시간이 특정 파일보다 최신이지만 다른 파일보다 오래된 모든 파일을 찾으려면 -newer 옵션을 사용할 수 있습니다. 일반적인 형식은 다음과 같습니다:
newest_file_name !oldest_file_name
여기서, ! 논리적 NOT 기호입니다. 다음은 약 이틀 간격으로 변경된 두 개의 파일입니다.
아래의 find 명령은 변경 시간이 age.awk 파일보다 최신이지만 belts.awk 파일보다 오래된 파일을 찾을 수 있습니다.
$find -newer age.awk ! awk - exec ls -l {} ;
변경 시간이 정확히 2시간 전인 기존 파일이 없는 한 find 명령의 이 옵션을 사용하여 2시간 이내에 변경된 파일을 찾으려면 변경 시간을 비교하는 데 사용할 수 있는 파일이 아닙니다. 이 문제를 해결하려면 먼저 파일을 만들고 날짜와 타임스탬프를 원하는 시간으로 설정하면 됩니다. 이는 touch 명령을 사용하여 수행할 수 있습니다.
현재 시간이 2 3:4 0이라고 가정하고 2시간 이내에 변경된 파일을 찾으려면 먼저 다음과 같은 파일을 생성하면 됩니다.
요구 사항에 맞는 파일이 생성되었습니다. 여기서는 오늘이 5월 4일이고 파일 변경 시간이 지금보다 정확히 2시간 빠른 21시 40분이라고 가정합니다.
이제 find 명령의 -newer 옵션을 사용하여 현재 디렉토리에서 2시간 이내에 변경된 모든 파일을 찾을 수 있습니다.
$ find -newer dstamp -print
type 옵션 사용
Unix 또는 Linux 시스템에는 여러 가지 파일 유형이 있습니다.
/etc 디렉토리에서 모든 디렉토리를 찾으려면 다음을 사용할 수 있습니다.
$ find /etc - d -print
현재 디렉토리에서 디렉토리를 제외한 모든 유형의 파일을 찾으려면 다음을 사용할 수 있습니다.
$ find ! -type d -print
/etc 디렉토리에서 모든 기호를 찾으려면 파일을 링크하려면 다음을 사용할 수 있습니다.
$ find /etc -type l -print
크기 옵션을 사용하여
여기에 언급된 파일 길이는 블록 단위로 측정할 수 있습니다. 바이트 단위로 측정할 수도 있습니다. 바이트 단위로 측정된 파일 길이의 표현 형식은 N c입니다. 블록 단위로 측정된 파일 길이는 숫자로만 표현할 수 있습니다. 개인적으로 나는 항상 바이트를 사용하며, 파일 길이로 파일을 찾을 때 대부분의 사람들은 파일 시스템의 크기를 보는 경우가 아닌 한 블록 수 대신 이 파일 길이를 바이트 단위로 사용하는 것을 선호합니다. 왜냐하면 블록 측정을 사용하여 변환하는 것이 더 쉽기 때문입니다.
현재 디렉토리에서 길이가 1MB보다 큰 파일을 찾으려면 다음을 사용할 수 있습니다.
$ find . -size +1000000c -print
/home/apache에서 파일을 찾으려면 정확히 길이가 1 0 0바이트인 파일의 경우 다음을 사용할 수 있습니다.
$ find /home/apache -size 100c -print
현재 디렉토리에서 1 0 블록보다 긴 파일을 찾으려면( 한 블록은 5 1 2 바이트와 같음) 다음을 사용할 수 있습니다:
$ find . -size +10 -print
깊이 옵션 사용
find 명령을 사용할 때 모든 파일을 일치시킬 수 있습니다. 먼저 하위 디렉터리에서 검색하세요. 깊이 옵션을 사용하여 find 명령이 이를 수행하도록 할 수 있습니다. 그 이유 중 하나는 find 명령을 사용하여 파일 시스템을 테이프에 백업할 때 먼저 모든 파일을 백업한 다음 하위 디렉터리의 파일을 백업하기 때문입니다.
아래 예에서 find 명령은 파일 시스템의 루트 디렉터리에서 시작하여 CON.FILE이라는 파일을 찾습니다.
먼저 모든 파일을 일치시킨 다음 하위 디렉터리에서 검색합니다.
$ find / -name "CON.FILE" -length -print
마운트 옵션
을 사용하여 현재 파일 시스템에서 파일을 찾으려면(다른 파일 시스템을 입력하지 않고), 다음의 마운트 옵션을 사용할 수 있습니다. f i n d 명령.
다음 예에서는 현재 디렉터리에서 시작하여 이 파일 시스템에 있는 파일 이름이 X C로 끝나는 파일을 찾습니다.
$ find -name "*.XC" -mount -print
사용 cpio 옵션
cpio 명령을 사용하여 테이프 장치에 파일을 백업하거나 테이프 장치에서 파일을 복원할 수 있습니다. find 명령을 사용하여 전체 파일 시스템(대부분 파일 시스템의 일부)에서 파일을 찾은 다음 cpio 명령을 사용하여 해당 파일을 테이프에 백업할 수 있습니다. cpio 명령을 사용하여 /etc/, /home/ 및 /apps 디렉터리의 파일을 백업하려면 아래 제공된 명령을 사용할 수 있지만 현재 파일 시스템의 루트 디렉터리에 있다는 점을 기억하세요.
$cd /
$find etc home apps -length -print | cpio -ivcdC65536 -o /dev/rmt0
(위 예에서 첫 번째 줄 끝에 있는 명령은 명령이 아직 종료되지 않았음을 쉘에 알려줍니다. , 후속 캐리지 리턴은 무시됩니다. )
위의 예에서는 상대 경로라고 하는 경로에 /가 누락되어 있음을 알 수 있습니다. 상대 경로를 사용하는 이유는 테이프에서 이러한 파일을 복원할 때 파일을 복원할 경로를 선택할 수 있기 때문입니다. 예를 들어, 먼저 이러한 파일을 다른 디렉터리에 복원하고 해당 파일에 대해 특정 작업을 수행한 다음 원래 디렉터리에 복원할 수 있습니다. /etc와 같이 백업 중에 절대 경로를 사용하는 경우 복구 중에는 /etc 디렉터리로만 복원할 수 있으며 다른 선택은 없습니다. 위의
예에서는 find 명령에 먼저 /etc 디렉토리로 이동한 다음 /home 및 /apps 디렉토리로 이동하여 해당 디렉토리의 파일을 먼저 일치시킨 다음 해당 하위 디렉토리의 파일을 일치시키도록 지시했습니다. 결과적으로 백업을 위해 cpio 명령으로 파이프됩니다. 그런데 위의 예에서 cpio 명령은 C65536 옵션을 사용했습니다. B 옵션을 사용할 수도 있었지만 이렇게 하면 각 블록의 크기가 C65536 옵션을 사용한 후 블록 크기가 5 1 2 바이트가 되었습니다. 64K 바이트(65536/1024).
exec 또는 ok를 사용하여 셸 명령을 실행합니다.
일부 파일을 일치시킨 후 해당 파일에 대해 특정 작업을 수행할 수 있습니다. 이 경우 -exec 옵션을 사용할 수 있습니다.
exec 옵션을 사용하기 위해서는 print 옵션을 동시에 사용해야 합니다. find 명령을 확인하면 명령이 현재 경로의 상대 경로와 파일 이름만 출력한다는 것을 알 수 있습니다.
ls -l 명령을 사용하여 일치하는 파일을 나열하려면 find 명령의 -exec 옵션에 ls -l 명령을 넣을 수 있습니다(예:
위의 예에서 find 명령은 현재 디렉터리의 모든 일반 파일을 일치시키고 -exec 옵션에 ls -l 명령을 사용하여 나열합니다.
/logs 디렉토리에서 5일 이상 전에 변경된 파일을 찾아 삭제하려면 다음을 사용하세요.
$ findlogs -type f -mtime +5 -exec rm {} ;
쉘에서 어떤 방식으로든 파일을 삭제하기 전에 먼저 해당 파일을 확인해야 합니다. -exec 옵션이 포함된 안전 모드는 mv 또는 rm과 같은 명령을 사용할 때 사용할 수 있습니다. 일치하는 각 파일을 작업하기 전에 메시지가 표시됩니다. 다음 예에서 find 명령은 현재 디렉토리에서 파일 이름이 .LOG로 끝나고 수정 시간이 5일 이상 지난 모든 파일을 검색하여 삭제하지만 삭제하기 전에 프롬프트만 표시합니다.
파일을 삭제하려면 y 키를 누르고, 삭제하지 않으려면 n 키를 누르세요.
-exec 옵션과 함께 모든 형태의 명령을 사용할 수 있습니다. 다음 예에서는 grep 명령을 사용합니다. find 명령은 먼저 "password*"라는 이름의 모든 파일(예: 비밀번호, 비밀번호.old, 비밀번호.bak)을 일치시킨 다음 grep 명령을 실행하여 이러한 파일에 라운더 사용자가 있는지 확인합니다.
$ find . -regex ".*/[0-9]*/.c" -print
./2234.c
여기서 -wholename 및 -path는 위에서 언급한 전체 경로와 관련이 있습니다.
-wholename과 -path는 모두 테스트 항목(테스트)이며 동일한 기능을 갖습니다. -path는 말 그대로 경로 이름(또는 디렉터리 이름)만 일치한다는 착각을 줍니다. 실제로 파일 이름도 일치할 수 있으므로 -wholename이라는 이름이 더 적합합니다. 이 예를 보세요. 현재 디렉토리에 puk.txt라는 파일이 있습니다. -path:
$ find -path '*phone/pu*'
./phone /puk.txt
또 언급할 사항: -path 사용의 일반적인 형식은 다음과 같습니다. find [path ...] -path 패턴 ...
즉, [path .. .] 부분 유사한 패턴을 가진 디렉터리에서 파일을 찾는 대신 경로에서 패턴을 사용하여 모든 파일의 전체 파일 이름을 일치시킵니다.
출력 형식
원하는 파일을 찾아 파일 이름을 단조롭게 출력하고 싶지 않다면 -printf 액션 항목을 사용하여 원하는 형식으로 출력할 수 있습니다. -의 몇 가지 매개 변수는 다음과 같습니다. printf 작업:
%p 경로 이름을 포함한 출력 파일 이름
%f 경로 이름을 제외한 출력 파일 이름
%m 8진수 형식의 출력 파일 권한
%g 파일이 속한 그룹을 출력합니다. 속함
%h 출력 파일이 있는 디렉터리의 이름
%u 출력 파일의 소유자 이름
...
예:
$ find -user xixi -printf "%m %p //n "
644 ./phone1/hello.c
644 ./0dfe.c
find 및 xargs
의 -exec 옵션을 사용하는 경우 일치하는 파일을 처리하는 find 명령, 실행을 위해 일치하는 모든 파일을 exec에 전달하는 find 명령. 불행하게도 일부 시스템에서는 exec에 전달할 수 있는 명령 길이에 제한이 있으므로 find 명령이 몇 분 동안 실행된 후 오버플로 오류가 발생합니다. 오류 메시지는 일반적으로 "매개변수 열이 너무 깁니다." 또는 "매개변수 열이 오버플로되었습니다."입니다.
xargs 명령이 특히 find 명령과 함께 사용되는 곳입니다. find 명령은 일치하는 파일을 xargs 명령에 전달하고 x a rg s 명령은 -exec 옵션과 달리 매번 파일의 일부만 가져오는 대신 전체를 가져옵니다. 이런 방식으로 받은 파일의 첫 번째 배치를 처리한 다음 다음 배치 등을 처리할 수 있습니다. 일부 시스템에서는 -exec 옵션을 사용하면 일치하는 모든 파일을 한 번에 매개변수로 실행하는 대신 일치하는 각 파일을 처리하기 위해 해당 프로세스가 시작됩니다. 어떤 경우에는 너무 많은 프로세스가 발생하여 시스템에 문제가 있습니다. 성능 저하로 인해 효율성이 높지 않습니다. xargs 명령을 사용하는 동안에는 프로세스가 하나만 있습니다. 또한 xargs 명령을 사용할 때 모든 매개변수를 한 번에 가져올지 아니면 일괄적으로 가져올지 여부와 매번 가져오는 매개변수 수는 명령의 옵션과 시스템 커널에서 해당 조정 가능한 매개변수 수에 따라 결정됩니다. .
다음 예제는 시스템의 모든 일반 파일을 검색한 후 xargs 명령을 사용하여 해당 파일이 어떤 유형에 속하는지 테스트합니다. 다음 예제는 전체 시스템에서 메모리 정보 덤프 파일(코어 덤프)을 검색하고, 그런 다음 결과를 저장합니다. /tmp/core.log 파일로 이동합니다:
$ find . -name "core" -print | xargs echo "" >/tmp/core.log
다음 예는 /apps/audit 디렉토리 사용자가 읽기, 쓰기 및 실행 권한을 갖고 있는 모든 파일과 해당 쓰기 권한을 취소합니다.
$ find /apps/audit -perm -7 -print | xargs chmod o-w
In 다음 예에서는 gr e p를 사용합니다. 이 명령은 모든 일반 파일에서 단어 device를 검색합니다.
$ find / -type f -print | xargs grep "device"
다음 예에서는 grep 명령을 사용합니다. 현재 디렉토리에서 모든 일반 파일을 검색하려면 다음에서 DBO라는 단어를 검색하세요.
$ find -name * -type f -print |