리눅스 / 명령어 / find / 파일 또는 디렉토리를 찾는 명령어
Linux의 find 명령은 지정한 디렉터리와 그 하위 항목을 살펴보며 이름, 종류, 크기 등의 조건에 맞는 파일이나 디렉터리를 찾습니다. 검색할 위치와 조건을 함께 지정하고, 파일 이름 패턴은 셸이 미리 확장하지 않도록 따옴표로 감싸세요.
기본 형식과 검색 범위
다음 형식에서 시작 경로는 검색을 시작할 위치이고, 조건은 찾을 대상을 제한합니다. 경로 자체도 검색 대상에 포함됩니다. 아래 예제는 GNU findutils의 find와 Bash를 기준으로 합니다.
find PATH EXPRESSION
find .은 현재 디렉터리와 하위 디렉터리를 탐색하고, find /etc는 /etc에서 시작합니다. 조건을 지정하지 않으면 경로를 출력하며 숨김 파일과 숨김 디렉터리도 탐색합니다. 권한이 없는 디렉터리는 접근 오류가 표시될 수 있고 그 내부는 검색되지 않습니다.
다음 실습은 새 임시 디렉터리에 파일을 만듭니다. 같은 터미널에서 이어서 실행해야 workdir 변수가 유지됩니다. 경로를 출력해 위치를 확인한 뒤 예제를 실행하세요.
workdir=$(mktemp -d)
mkdir -p "$workdir/docs" "$workdir/empty-dir"
touch "$workdir/docs/app.conf" "$workdir/docs/EXTRA.CONF" "$workdir/docs/notes.txt" "$workdir/.hidden.conf" "$workdir/empty.txt"
printf '%s\n' "$workdir"
이름과 파일 종류로 찾기
-name은 경로 전체가 아닌 마지막 이름을 기준으로 대소문자를 구분해 일치시킵니다. -iname은 대소문자를 구분하지 않습니다. 작은따옴표는 *를 셸이 먼저 확장하지 않고 find에 전달하기 위해 필요합니다.
find "$workdir" -name '*.conf'
find "$workdir" -iname '*.conf'
첫 명령은 app.conf와 .hidden.conf를 찾고, 두 번째 명령은 EXTRA.CONF도 찾습니다. 출력 순서는 환경에 따라 달라질 수 있습니다. 기존 예제처럼 find /etc *.conf라고 입력하면 이름 조건이 없고 셸의 확장 결과에 따라 의도하지 않게 동작하므로 사용하지 않습니다. 대신 find /etc -name '*.conf'처럼 입력합니다.
-type f는 일반 파일, -type d는 디렉터리를 찾습니다. 조건을 이어 쓰면 모두 만족해야 합니다.
find "$workdir" -type f -name '*.conf'
find "$workdir" -type d -name 'docs'
첫 명령은 확장자가 일치하는 일반 파일만, 두 번째는 이름이 docs인 디렉터리만 출력합니다. GNU find는 기본적으로 심볼릭 링크를 따라 하위 디렉터리로 내려가지 않습니다. 링크 자체를 찾으려면 -type l을 사용합니다.
깊이와 빈 항목으로 범위 좁히기
-maxdepth 1은 시작 경로와 바로 아래 항목까지만 검색합니다. 시작 경로를 결과에서 제외하려면 -mindepth 1을 함께 지정합니다. 두 옵션은 GNU find에서 조건보다 앞에 두는 것이 좋습니다.
find "$workdir" -mindepth 1 -maxdepth 1 -type d
실습에서는 바로 아래의 docs와 empty-dir이 출력됩니다. -empty는 빈 일반 파일과 빈 디렉터리를 찾으므로, 원하는 종류를 지정해 구분할 수 있습니다.
find "$workdir" -type f -empty
find "$workdir" -type d -empty
실습에서 touch로 만든 파일은 모두 비어 있습니다. 두 번째 명령에서는 empty-dir이 나타납니다. 검색 결과를 삭제 대상으로 바로 간주하지 말고 경로와 조건을 먼저 확인하세요.
찾은 파일에 명령 실행하기
-exec는 일치한 항목에 명령을 실행합니다. 다음 예제는 삭제하지 않고 일반 파일의 바이트 수를 출력합니다. {}는 찾은 경로로 바뀌고, +는 여러 경로를 가능한 한 묶어 명령에 전달합니다.
find "$workdir" -type f -name '*.conf' -exec wc -c -- {} +
실습 파일은 비어 있으므로 각 파일의 바이트 수가 0으로 표시됩니다. wc는 여러 파일을 받으면 합계도 표시할 수 있습니다. 파일 이름에 공백이 있어도 각 경로가 별도 인수로 전달됩니다. 항목마다 명령을 따로 실행하려면 + 대신 \;를 사용할 수 있습니다.
삭제나 변경 명령을 결합하기 전에는 같은 조건으로 먼저 경로만 출력하고 대상과 백업을 확인하세요. 다른 사용자가 검색 중 파일을 바꿀 수 있는 디렉터리에서는 확인 후에도 대상이 바뀔 수 있으므로 각별한 주의가 필요합니다. 자세한 내용은 GNU find 보안 고려 사항을 참고하세요.
결과가 예상과 다를 때
결과가 없으면 시작 경로, 이름의 대소문자와 확장자, 파일 종류를 차례로 확인하세요. 패턴을 따옴표로 감쌌는지, -name 대신 경로 전체가 필요한 상황은 아닌지도 확인합니다. 전체 경로를 기준으로 찾을 때는 -path를 사용할 수 있습니다.
권한 오류가 있으면 검색하지 못한 영역이 있다는 뜻입니다. 필요한 접근 권한을 확인하고, 관리자 권한을 사용할 때는 검색 범위와 실행할 동작을 신중하게 제한하세요. 이름 패턴과 옵션의 자세한 의미는 GNU find 이름 패턴 설명에서 확인할 수 있습니다.




