검색(Unix)
find (Unix)| 원저작자 | 딕 헤이트 |
|---|---|
| 개발자 | AT&T 벨 연구소 |
| 운영 체제 | Unix, Unix 계열, IBM i |
| 플랫폼 | 크로스 플랫폼 |
| 유형 | 명령어 |
| 면허증. | Find Utils: GPLv3+ |
Unix 계열의 운영체제 및 기타 일부 운영체제에서는find는 사용자가 지정한 기준에 따라 파일을 검색하여 일치하는 각 객체의 경로 이름을 출력하거나 다른 액션이 요구될 경우 일치하는 각 객체에 대해 해당 액션을 수행하는 명령줄 유틸리티입니다.
원하는 시작 위치에서 검색을 시작한 다음 계층 구조(일반적으로 트리)의 노드(디렉토리)를 재귀적으로 통과합니다.find는 시작 [1]디렉토리 아래에 마운트된 하나 이상의 스토리지 디바이스에 속하는 파티션의 다른 파일 시스템을 통과하고 검색할 수 있습니다.
가능한 검색 기준에는 파일 이름과 대조하는 패턴 또는 파일의 수정 시간 또는 액세스 시간과 대조하는 시간 범위가 포함됩니다.디폴트로는find는 현재 작업 디렉토리 아래에 있는 모든 파일의 목록을 반환합니다.단, 사용자는 검색을 시작 디렉토리에서 원하는 최대 레벨 수로 제한할 수 있습니다.
관련 정보locate프로그램은 를 통해 얻은 인덱스 파일의 데이터베이스를 사용합니다.find(일반적으로 에 의해 정기적으로 표시됨)cron작업) 파일 시스템 전체를 이름으로 검색할 수 있는 빠른 방법으로 제공합니다.
역사
find는 Programmer's Workbench 프로젝트의 일부로 버전 5 Unix에 등장했으며 함께 사용하도록 설계된 cpio와 [2]함께 [3]Dick Haight에 의해 작성되었습니다.
GNU find구현은 Eric Decker에 의해 작성되었습니다.이것은 나중에 데이비드 맥켄지, 제이 플레트, [4]팀 우드에 의해 강화되었다.
그find 명령어는 IBM i 운영 [5]체제에도 이식되었습니다.
구문 검색
$ [-H-L] 경로 찾기...[연산_연산...]이 두 가지 옵션에 따라 다음 두 가지 방법을 제어할 수 있습니다.find명령어는 심볼릭링크를 처리해야 합니다.기본 동작은 심볼릭링크를 따르지 않습니다.그-L플래그가 원인이 되어find명령어를 사용하여 심볼릭링크를 팔로우합니다.그-Hflag는 명령줄 인수를 처리하는 동안 심볼릭 링크만 따릅니다.이러한 플래그는, 다음의 POSIX 표준으로 지정되어 있습니다.find.[6] 일반적인 확장자는-Psymlink [7]following을 명시적으로 비활성화합니다.
식 앞에 경로가 하나 이상 있어야 합니다. find는 내부적으로 와일드카드를 해석할 수 있으며 셸글로빙을 제어하려면 명령어를 신중하게 따옴표로 묶어야 합니다.
식 요소는 명령줄 인수 경계로 구분됩니다.일반적으로 셸 구문에서는 공백으로 표시됩니다.왼쪽에서 오른쪽으로 평가됩니다.AND(-and 또는 -a), OR(-or -o) 등의 논리 요소와 술어(필터 및 액션)를 포함할 수 있습니다.
GNUfind에는 POSIX에 의해 지정되지 않은 많은 추가 기능이 있습니다.
술어
일반적으로 사용되는 프라이머리는 다음과 같습니다.
-name pattern: 파일명이 지정된 셸 스위칭 패턴과 일치하는지 여부를 테스트합니다.-type type: 파일이 지정된 유형인지 여부를 테스트합니다.허용되는 UNIX 파일 형식은 다음과 같습니다.-print: 항상 true를 반환합니다.현재 파일의 이름과 새 행을 stdout에 출력합니다.-print0: 항상 true를 반환합니다.현재 파일의 이름과 늘 문자를 stdout에 출력합니다.POSIX에서는 필요 없습니다.-exec program [argument ...];: 항상 true를 반환합니다.지정된 고정 인수와 파일의 현재 경로를 사용하여 프로그램을 실행합니다.-exec program [argument ...] {} +: 항상 true를 반환합니다.지정된 고정 인수와 가능한 한 많은 경로를 사용하여 프로그램을 실행합니다(xargs 등 최대 명령줄 크기까지).대부분의 구현에서 {}이(가) 추가로 발생하면 지정된 이름의 복사본이 추가로 생성됩니다(POSIX에는 [7]기능이 필요하지 않음).-ok program [argument ...];: 좋아요.-exec그러나 프로그램이 0을 반환하는지 여부에 따라 true 또는 false를 반환합니다.
표현식이 다음 중 하나를 사용하지 않는 경우-print0,-print,-exec, 또는-ok디폴트 설정에서는-print조건이 사실로 테스트될 경우.
연산자
연산자를 사용하여 find 명령어의 표현을 강화할 수 있습니다.연산자는 우선순위가 낮은 순서대로 나열됩니다.
( expr ): precedence 강제;! expr: expr이 false일 경우 true;expr1 expr2(또는expr1 -a expr2: AND.expr2는 평가되지 않습니다.expr1false 입니다.expr1 -o expr2: OR. expr2는 다음 경우 평가되지 않습니다.expr1정말이에요.
$ find . -name ' 파일A_*' -o -name 'fileB_*'이 명령어는 이름이 다음 문자로 시작하는 파일을 현재 작업 디렉토리 트리에서 검색합니다.fileA_또는fileB_견적을 내겠습니다.fileA_*셸이 확장하지 않도록 합니다.
$ 찾기. -name 'foo.cpp' '!' -path '.pathn'이 명령어는 서브 디렉토리 트리 ".svn"을 제외한 현재 작업 디렉토리 트리에서 이름이 "foo.cpp"인 파일을 검색합니다.견적은 다음과 같습니다.!조개껍질에 의해 역사 대체 문자로 해석되지 않도록 말이죠.
무한 출력으로부터 POSIX 보호
실제 파일 시스템에는 하드 또는 소프트 링크를 사용하여 생성된 루프 구조가 포함되어 있는 경우가 많습니다.POSIX 규격은 다음을 요구한다.
그
find유틸리티는 무한 루프를 검출합니다.즉, 마지막으로 발견된 파일의 상위인 이전에 방문한 디렉토리를 입력합니다.무한 루프가 감지되면find표준 오류에 대한 진단 메시지를 작성하고 계층 내 위치를 복구하거나 종료해야 한다.
예
현재 작업 디렉토리에서
$ 찾기. - 이름 'my*'현재 작업 디렉토리 트리에서 이름이 my로 시작하는 파일을 검색합니다.작은 따옴표는 셸 확장을 회피합니다.따옴표가 없으면 셸은 현재 작업 디렉토리에서 이름이 my로 시작하는 파일 목록으로 대체됩니다.프로그램의 새로운 버전에서는 디렉토리가 생략되어 현재의 작업 디렉토리를 나타냅니다.
일반 파일만
$ 찾기. -name 'my*' -type f이것에 의해, 상기의 검색 결과는 통상의 파일만으로 한정됩니다.따라서 디렉토리, 특수 파일, 심볼릭 링크 등은 제외됩니다.my*는 작은 따옴표(apostrophes)로 둘러싸여 있습니다.이렇게 하지 않으면, 셸은 my*를 현재의 작업 디렉토리내의 파일 리스트로 치환해 버립니다.
명령어
위의 예에서는 기본적으로 다음과 같은 이유로 결과 목록이 작성되었습니다.find를 실행합니다.-print액션.(의 초기 버전은find명령어에는 디폴트액션이 전혀 없기 때문에 결과적으로 파일목록이 파기되어 사용자가 당황할 수 있습니다.)
$ 찾기. -name 'my*' -type f -ls확장 파일 정보가 인쇄됩니다.
모든 디렉토리 검색
$ find / - name myfile - type f - print그러면 모든 디렉토리에서 이름이 myfile인 일반 파일이 검색되어 화면에 인쇄됩니다.일반적으로 이러한 방법으로 파일을 찾는 것은 좋지 않습니다.이 작업에는 상당한 시간이 걸릴 수 있으므로 디렉토리를 보다 정확하게 지정하는 것이 가장 좋습니다.일부 운영체제는 동적인 파일 시스템을 탑재하여find셸 고유의 문자를 포함한 보다 복잡한 파일명은 작은 따옴표로 묶어야 할 수 있습니다.
하나의 하위 디렉터리 트리를 제외한 모든 검색
$ find / - path excluded_path - prune - o - type f - name myfile - print그러면 서브디렉토리 트리 excluded_path(선행 /를 포함한 풀패스)를 제외한 모든 디렉토리가 검색됩니다.-prunemyfile이라는 이름의 일반 파일에 대해 작업을 수행합니다.
디렉토리 지정
$ find / home / weedly - name myfile - type f - print그러면 /home/weedly 디렉토리 트리에서 myfile이라는 이름의 일반 파일이 검색됩니다.항상 디렉토리를 기억할 수 있는 가장 깊은 수준으로 지정해야 합니다.
여러 디렉터리 검색
$ local / tmp - name mydir - type d - print를 찾습니다.현재 작업 디렉토리의 로컬서브 디렉토리 트리와 /tmp 디렉토리 트리에서 mydir라는 이름의 디렉토리를 검색합니다.
오류 무시
루트 이외의 사용자로 이 작업을 수행하는 경우 권한 거부 오류 및 기타 오류를 무시할 수 있습니다.오류는 stderr로 출력되므로 출력을 /dev/null로 리디렉션하여 오류를 억제할 수 있습니다.다음 예시는 bash 쉘에서 이를 수행하는 방법을 보여 줍니다.
$ find / - name myfile - type f - print 2 > / dev / paramescsh 또는 tcsh 사용자인 경우 stdout도 리다이렉트하지 않고 stderr을 리다이렉트할 수 없습니다.sh 를 사용하여find명령어를 사용하여 이를 회피합니다.
$ sh - c "find / - name myfile - type f - print 2 > / dev / parames "csh 또는 tcsh를 사용할 때 대체 방법은 stdout 및 stderr 출력을 grep 명령어로 파이프하는 것입니다.다음으로 권한 거부 오류가 포함된 행을 억제하는 예를 나타냅니다.
$ find . - name myfile & grep - v '권한 거부'이름이 다른 파일 중 하나 찾기
$ find . \ ( - name ' * jsp ' - o - name ' * jsp ' \ ) - type f - ls그-ls연산자는 확장 정보를 인쇄하고, 이 예에서는 이름이 'jsp' 또는 'display'로 끝나는 일반 파일을 찾습니다.괄호는 필수입니다.많은 셸에서 괄호는 백슬래시로 이스케이프해야 합니다.\(그리고.\)특수 셸 문자로 해석되지 않도록 합니다.그-ls일부 버전에서는 연산자를 사용할 수 없습니다.find.
액션을 실행하다
$ / var / var / var / mp3 - name ' . mp3 ' - type f - exec chmod 644 { } \ ;이 명령어는 디렉토리 트리 /var/ftp/mp3에서 이름이 .mp3로 끝나는 모든 일반 파일의 권한을 변경합니다.액션은 스테이트먼트를 지정함으로써 실행됩니다.-exec chmod 644 {} \;명령어로 지정합니다.이름이 로 끝나는 모든 일반 파일에 대해.mp3, 명령어chmod 644 {}를 치환하여 실행됩니다.{}파일명을 지정합니다.세미콜론(명령어 구분자로 해석되는 셸을 피하기 위해 역슬래시됨)은 명령어의 끝을 나타냅니다.허가644(통상은 다음과 같이 표시됩니다).rw-r--r--는 파일 소유자에게 파일 읽기 및 쓰기 권한을 부여하고 다른 사용자는 읽기 전용 액세스 권한을 부여합니다.일부 포탄에서는{}따옴표를 붙여야 합니다.후행 ";"는 보통 선두와 함께 인용된다.\", 단 하나의 따옴표로 묶을 수도 있습니다.
명령어 자체는 따옴표로 묶지 마십시오.따옴표로 묶지 않으면 다음과 같은 오류 메시지가 나타납니다.
find: echo "mv ./3bfn rel071204": 해당 파일 또는 디렉토리가 없습니다.즉,find라는 이름의 파일을 실행하려고 합니다.echo "mv ./3bfn rel071204"'그리고 실패한다.
여러 결과에 대해 실행할 경우 파일 이름을 ARG_MAX까지 수집한 다음 파일 이름 목록을 사용하여 COMMAND를 실행하는 것이 더 효율적입니다.
$ 찾기. -exec COMMAND {} +이렇게 하면 공백이 있는 파일 이름이 실행된 사용자에게 전달됩니다.COMMAND조개껍데기로 쪼개지지 않고요.
파일 및 디렉터리 삭제
그-deleteaction은 GNU 확장자이며 이 확장자를 사용하면 활성화 됩니다.-depth따라서 find 명령어를 테스트하는 경우-print대신-delete어떤 일이 일어날지 알아내기 위해서, 당신은 그것을 하기 전에-depth -print.
빈 파일을 삭제하고 이름을 인쇄합니다(주의:-empty는 GNU에서 벤더 고유의 확장입니다.find모든 것을 이용할 수 있는 것은 아닐지도 모른다.find실장) :
$ find . - empt - delete - print빈 일반 파일 삭제:
$ 찾기. -type f -empty - delete빈 디렉토리 삭제:
$ 찾기. -type d -empty - delete이름이 'bad'인 빈 파일 삭제:
$ 찾기. -name bad -empty - delete경고.- 그-delete다음과 같은 조건과 함께 행동을 취해야 한다-empty또는-name:
$ find . - delete #그럼 에서 모두 삭제됩니다.문자열 검색
이 명령어는 /tmp 디렉토리 트리의 모든 파일에서 문자열을 검색합니다.
$ find / tmp - type f - exec grep 'search string' / dev / param '{}' \ +그/dev/null인수는 발견된 텍스트 앞에 파일 이름을 표시하기 위해 사용됩니다.그렇지 않으면 검색된 텍스트만 인쇄됩니다(또는 파일 이름을 강제로 인쇄하는 -H 플래그를 지원하는 버전도 있습니다).GNUgrep를 단독으로 사용하여 다음 작업을 수행할 수 있습니다.
$ grep - r 'search string' / tmpjsmith의 홈 디렉토리 트리에서 "LOG"를 검색하는 예:
$ find ~jsmith -exec grep LOG '{}' /dev/null \; -print /home/jsmith/scripts/errpt.sh:cp $LOG $FIXEDLOGNAME/home/jsmith/scripts/errpt.sh: cat $LOG / home / jsmith / scripts / title :사용자=$LOGNAME현재 작업 디렉토리 트리의 모든 XML 파일에서 문자열 "ERROR"을 검색하는 예:
$ find . - name " . xml " - exec grep " ERROR " / dev / null " { } " \ +이 예에서는 검색 문자열을 둘러싼 큰따옴표("")와 중괄호를 둘러싼 작은따옴표("")는 옵션이지만 공백 및 문자열에 특수문자를 허용해야 합니다.더 복잡한 텍스트(특히 'sh'와 'csh'에서 파생된 대부분의 인기 셸에서)의 작은 따옴표가 종종 더 쉬운 선택입니다. 큰 따옴표가 모든 특별한 해석을 막는 것은 아니기 때문입니다.영어 축소가 있는 파일 이름을 인용하는 것은 아포스트로피가 있는 문자열은 큰따옴표로 보호하는 것이 더 쉽기 때문에 이것이 얼마나 복잡해질 수 있는지를 보여줍니다.
$ find . - name "file-containing-can't" - exec grep "cannot" "{}" \; - print사용자가 소유한 모든 파일 검색
$ find .-user <userid >대소문자를 구분하지 않는 모드에서 검색
주의:-iname는 표준이 아니므로 모든 구현에서 지원되는 것은 아닙니다.
$ 찾기. -iname 'My File*'이 경우,-iname사용하시는 시스템에서는 스위치가 지원되지 않기 때문에 다음과 같은 회피책이 있을 수 있습니다.
$ 찾기. 이름 '[mM][YY][F][iI][lL][eE]*'이는 Perl을 사용하여 위의 명령어를 작성합니다(일반적으로 특수문자는 표준 입력인 'sh'에 입력되기 전에 올바르게 따옴표로 묶이지 않기 때문에 이러한 종류의 사용은 위험합니다).
$echo 'MyFile*' perl - pe 's / ( [ a - zA - Z ] / [ \L\1\U\1]/g;s/(.*)/find . -name \1/' sh크기별 파일 검색
크기가 100킬로바이트에서 500킬로바이트 사이인 파일 검색:
$ find . - size + 100k - a - size - 500k빈 파일 검색:
$ find . - size 0k비어 있지 않은 파일 검색:
$ find .! - size 0k이름 및 크기로 파일 검색
$ find /usr / src ! \( -name '*,v' -o -name '.*,v' \) '{}' \; - print이 명령어는 /usr/src 디렉토리 트리를 검색합니다.'*,v' 및 '.*,v' 형식의 모든 파일은 제외됩니다.주의해야 할 중요한 인수는 마우스 오버 시 표시되는 툴팁에 있습니다.
find /opt \( -name error_log -o -name 'access_log' -o -name 'ssl_engine_log' -o -name 'sl_engine_log' -o -name 'sl_log' -o -name 'sl_log'에 있는 파일에 대해 설명합니다.out' \) - size + 300000k - a - size - 5000000k'; cat / dev / prame > $file done단위는 [bckw] 중 하나여야 합니다. 'b'는 512바이트 블록, 'c'는 바이트, 'k'는 킬로바이트, 'w'는 2바이트 워드를 의미합니다.이 크기에서는 간접 블록은 카운트되지 않지만 실제로 할당되지 않은 스파스 파일의 블록은 카운트됩니다.
시간별 파일 검색
-mtime: 변경 시간-ctime: inode 변경 시간-atime: 접속 시간
비교적 일 전에 수정된 파일:
- +[숫자] = 적어도 며칠 전입니다.
- [number] = 며칠 전보다는 덜 됐어요
- [number] = 며칠 전 그대로입니다.
- 옵션 추가
-daystart마지막 24시간이 아닌 하루 시작(0시)부터 시간을 측정합니다.
일주일(7일) 이후 수정된 문서 폴더의 모든 텍스트 파일을 찾는 예:
$ find ~ / 문서 / - iname "*.txt" - mtime - 7절대 날짜 및 시간 이전 또는 이후에 수정된 파일:
-newermt YYYY-MM-DD: 최종 변경 후 날짜-not -newermt YYYY-MM-DD: 최종 수정 전 날짜
2017년 2월에 마지막으로 편집한 모든 텍스트 파일을 찾는 예:
$ find ~ / Documents / -iname "*.txt" -newermt 2017-02-01 -newermt 2017-03-01이 아닙니다.-newer [file]: 지정된 파일보다 최근에 수정되었습니다.-cnewer: inode 변경시간과 동일합니다.-anewer: 액세스 시간과 동일합니다.- 또, 다음과 같이 추가 가능
-not역방향 결과 또는 범위의 경우.
"document.txt"보다 최근에 편집된 모든 텍스트 파일을 나열합니다.
$ find ~ / Documents / -iname "*.txt" - newer 문서.txt관련 유틸리티
locate는 파일 시스템의 디렉토리 트리가 아닌 미리 구축된 파일 데이터베이스를 검색하는 Unix 검색 도구입니다.이것은 보다 빠르다.find데이터베이스가 최신 상태가 아닐 수 있기 때문에 정확도가 떨어집니다.grep는 정규 표현과 일치하는 행을 검색하여 기본적으로 표준 출력에 일치하는 행을 보고하기 위한 명령줄 유틸리티입니다.tree는 디렉토리 트리에 있는 파일을 반복적으로 나열하는 명령줄 유틸리티로 파일 계층 내 위치에 따라 파일 이름을 들여씁니다.- GNU Find Utilities(일명 Findutils)는 도구의 구현을 포함하는 GNU 패키지입니다.
find그리고.xargs. - BusyBox는 리소스가 매우 제한된 임베디드 운영 체제를 위해 여러 Unix 도구를 하나의 실행 파일로 제공하는 유틸리티입니다.또, 다음의 버전도 제공하고 있습니다.
find. dir에는 파일 또는 디렉토리를 재귀적으로 검색하는 /s 옵션이 있습니다.- Bell Labs의 Plan 9는 2개의 유틸리티를 사용하여 대체
find: awalk트리만 걸으면 이름만 출력하고sor셸 스크립트 형식의 식을 평가하여 필터링(Grep 등)만 합니다.파이프를 통해 임의 필터를 사용할 수 있습니다.이 명령어들은 User Space의 Plan 9의 일부가 아니기 때문에 구글의 Benjamin Barenblat은 GitHub을 [8]통해 POSIX 시스템으로 이식된 버전을 가지고 있다. fd단순한 대체 수단이다findRust 프로그래밍 [9]언어로 작성되었습니다.
「 」를 참조해 주세요.
- mdfind는 macOS 및 Darwin용 메타데이터를 사용하는 유사한 유틸리티입니다.
- Unix 명령어 목록
- DOS 명령어 목록
- 필터(고차 함수)
- find (Windows), Unix와는 매우 다른 DOS 및 Windows 명령어
find - forfiles, Unix와 유사한 속성별로 파일을 찾는 Windows 명령어
find - grep: Windows 와 마찬가지로 패턴에 일치하는 텍스트를 찾는 Unix 명령어
find
레퍼런스
- ^ "find(1) - Linux manual page". man7.org. Retrieved 2019-11-19.
- ^ McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. 139.
- ^ "libarchive/libarchive". GitHub. Retrieved 2015-10-04.
- ^ 파일 검색
- ^ IBM. "IBM System i Version 7.2 Programming Qshell" (PDF). Retrieved 2020-09-05.
- ^ : 파일 검색– Shell and Utilities Reference, 싱글 UNIX 사양, The Open Group 버전4
- ^ a b – FreeBSD 일반 명령어 매뉴얼
- ^ "google / walk: Plan 9 style utilities to replace find(1)". GitHub. Retrieved 30 March 2020.
- ^ Peter, David (30 March 2020). "sharkdp/fd: A simple, fast and user-friendly alternative to 'find'". GitHub.