Linux에서 찾기 명령의 40가지 최고의 예
리눅스 find 명령어는 시스템 관리자가 다양한 검색 조건을 사용하여 파일 및 디렉토리를 찾아 관리할 수 있도록 돕는 강력한 유틸리티입니다. 파일 이름, 종류, 확장자, 크기, 권한 등 여러 기준을 활용하여 원하는 파일을 쉽게 검색할 수 있습니다.
단순히 파일을 찾는 것뿐만 아니라, find 명령어는 다른 명령어와 조합하여 검색 결과에 대한 다양한 작업을 수행할 수 있게 해줍니다. 특히, '-exec' 옵션을 사용하면, 시스템 관리자는 외부 명령어를 실행하여 특정 조건에 부합하는 파일에 대해 복사, 이동, 삭제 또는 권한 변경과 같은 작업을 자동화할 수 있습니다.
이 글에서는 기본적인 리눅스 find 명령어의 사용법을 예시와 함께 설명합니다. 파일과 디렉토리를 찾는 방법부터 시작하여, -exec 옵션을 활용하여 파일 크기, 권한 등 다양한 조건에 따라 작업을 수행하는 방법을 자세히 알아봅니다.
find 명령어의 일반적인 구조는 다음과 같습니다.
find {검색_경로} {검색_조건} {수행할_동작}
각 요소는 다음과 같은 의미를 가집니다.
- 검색_경로: 검색을 시작할 디렉토리 경로를 지정합니다.
- 검색_조건: 찾고자 하는 파일 또는 디렉토리의 이름이나 특정 패턴을 정의합니다.
- 수행할_동작: 검색 결과에 대해 실행할 작업(복사, 삭제, 이동 등)을 지정합니다.
이 튜토리얼에서는 특정 패턴과 일치하는 파일 및 디렉토리를 검색하고, find 명령어가 찾아낸 파일이나 디렉토리에 대해 다양한 작업을 수행하는 방법을 살펴봅니다. 이 가이드는 Ubuntu를 기준으로 작성되었지만, 대부분의 리눅스 배포판과 버전에서도 동일하게 적용될 수 있습니다.
파일 및 디렉토리 검색
이름 또는 확장자로 특정 파일 찾기
특정 파일명을 가진 파일을 찾으려면, 루트 디렉토리(/)에서 다음 명령어를 실행하세요. 명령어에는 검색하려는 파일의 정확한 이름이 포함되어야 합니다.
find . -name file22.txt
결과:
./test/file22.txt ./sales/file22.txt
결과는 파일의 전체 경로를 포함합니다. 파일이 어느 디렉토리에 있는지 모를 때나 여러 위치에 동일한 파일이 있을 때 특히 유용합니다.
현재 위치에서 다른 디렉토리 내의 파일을 검색할 수도 있습니다. 이 경우, 검색하고자 하는 디렉토리의 경로를 명확히 지정해야 합니다.
find ./test -name file22.txt
다른 디렉토리에서 특정 파일 찾기
예를 들어, 'test' 디렉토리에서 'file'로 시작하는 모든 파일을 검색하려면 다음 명령어를 사용합니다.
find ./test -name file*
결과:
./test/file22.txt ./test/file30.doc ./test/file1.txt ./test/file5,doc
확장자로 파일 검색
특정 확장자를 가진 파일을 찾으려면 다음과 같이 명령어를 수정합니다.
find . -name *.txt
결과:
./test/subtest/subfil.txt ./test/file22.txt ./test/file1.txt ./home1/files32.txt ./home2/file22.txt ./qa/tags.txt
이름으로 파일 및 디렉토리 찾기
문자 'qa'로 시작하는 파일과 디렉토리를 검색하려면 다음 명령어를 실행합니다. 여기서는 qatree.txt, qa.txt 파일과 'qa'라는 이름의 디렉토리가 존재한다고 가정합니다.
find ./ -name "qa*"
결과:
./test/qatree.pdf ./test/qa.txt ./home/qa
이 명령어는 검색 조건과 일치하는 파일과 디렉토리를 모두 반환합니다. 파일 또는 디렉토리 중 하나만 찾으려면, 명령어에 해당 유형을 명시해야 합니다.
파일 또는 디렉토리만 찾기
파일만 검색하려면 '-type f' 스위치를 사용합니다.
find ./ -type f -name "qa*"
결과:
./test/qatree.pdf ./test/qa.txt
디렉토리만 검색하려면 '-type d' 옵션을 추가합니다.
find ./ -type d -name "qa*"
결과:
./home/qa
대소문자를 구분하지 않는 검색
'-name' 스위치를 사용하는 모든 검색은 대소문자를 구분합니다. 대소문자 구분 없이 모든 결과를 검색하려면 '-iname' 옵션을 사용합니다.
find ./ -iname "qa*"
결과:
./test/qatree.pdf ./test/qa.txt ./test/QAtest.txt ./home/qa
여러 디렉토리에서 파일 검색
여러 디렉토리에서 파일을 검색하려면 해당 경로를 명령어에 추가합니다. 다음은 'test'와 'numeric' 디렉토리에서 'file22.txt' 파일을 검색하는 예시입니다.
find ./test ./numeric -name file22.txt -type f
결과:
./test/file22.txt /root/numeric/file22.txt
모든 디렉토리에서 확장자가 다른 여러 파일 찾기
find 명령어를 사용하여 '*.doc', '*.txt', '*.pdf'와 같이 여러 확장자를 가진 파일을 한 번에 검색할 수 있습니다. 각각의 확장자를 별도로 검색하거나, 모든 확장자를 포함하는 하나의 명령어를 사용할 수 있습니다.
find . -type f ( -name "*.txt" -o -name "*.pdf" -o -name "*.doc" )
결과:
./test/subtest/subfil.txt ./test/qatree.pdf ./test/file22.txt ./test/qa.txt ./test/file30.doc ./books/acro.pdf ./data1/FILE22.txt ./docs/files32.txt
특정 텍스트가 포함된 파일 찾기
파일 이름이나 위치를 기억하지 못하지만 특정 텍스트가 포함된 파일을 찾고 싶을 때가 있습니다. 다음 명령어를 사용하면 특정 텍스트가 포함된 모든 파일을 검색할 수 있습니다.
find / -type f -exec grep -l -i "hyperconvergence" {} ;
결과:
/root/numeric/hci /root/HCIP
'-i' 옵션을 사용하면 대소문자를 구분하지 않고 'hyperconvergence', 'Hyperconvergence' 등과 같은 텍스트를 모두 찾을 수 있습니다.
특정 디렉토리에서만 검색하려면 명령어에 해당 디렉토리 경로를 추가합니다.
find ./numeric -type f -exec grep -l -i "hyperconvergence" {} ;
결과:
./numeric/hci
더 많은 grep 명령어 예시를 살펴보세요.
크기에 따라 파일 및 디렉토리 찾기
특정 크기 범위 내, 비어 있거나, 특정 크기보다 작거나 큰 모든 파일 또는 디렉토리를 찾을 수 있습니다. 검색하려는 파일 또는 디렉토리 유형에 따라 적절한 크기 형식을 사용하세요.
크기 옵션은 다음과 같습니다.
| c | 바이트 |
| k | 킬로바이트 |
| M | 메가바이트 |
| G | 기가바이트 |
특정 크기의 파일 찾기 - 30MB와 동일
find / -size 30M
지정된 크기보다 큰 파일 찾기
find -size +2M
결과:
. /Downloads/ubuntu18043.iso ./.cache/pip/http/6/e/3/8/3/6e38383f41850c3e5705d48116bc52f81b92a80500f414305057 7a9c
현재 디렉터리에서 10MB 미만의 파일 찾기
find . -type f -size -10M
크기가 100~200MB인 파일 찾기
find / -size +100M -size -200M
20kb보다 큰 디렉토리를 찾으십시오.
find / -type d -size +20k
빈 파일과 디렉터리를 찾습니다.
파일:
find ./ -type f -size 0
또는
find ./ -type f --empty
디렉토리:
find ./ -type d --empty
수정 시간 또는 나이로 파일 찾기
n일보다 오래된 파일 찾기:
find /path/ -type f -name '*.txt' -mtime +8
'-mtime +8'은 8일보다 오래된 txt 파일을 검색합니다.
수정일 기준
지난 17시간 이내에 수정된 파일 찾기:
find . -mtime -17 -type f
지난 10일 이내에 수정된 디렉토리 찾기:
find . -mtime -10 -type d
액세스 또는 수정을 기반으로 파일 찾기
액세스한 날짜 또는 시간을 기준으로 파일을 검색합니다. 이를 통해 특정 기간 내에 액세스했거나 액세스하지 않은 파일을 확인할 수 있습니다.
홈 디렉토리에서 지난 10일 동안 액세스하지 않은 파일을 확인하려면:
find /home -atime +10
정확히 10일 전에 액세스한 파일:
find /home -atime 10
지난 10일 이내에 액세스한 파일:
find /home -atime -10
지난 n일 이내에 수정된 파일 찾기
다음 명령어를 사용하여 지난 10일 이내에 수정된 '/home' 디렉토리의 파일을 찾을 수 있습니다.
find /home -mtime -10
특정 기간 내에 수정된 파일을 찾습니다.
예를 들어, 홈 디렉터리에서 6일에서 15일 사이에 수정된 모든 파일을 검색하려면:
find /home -type f -mtime +6 -mtime -15
최근 10분 이내에 액세스한 파일 및 디렉토리
최근 10분 이내에 액세스한 파일을 찾으려면 '-amin' 옵션을 사용하세요.
find . -amin -10 -type f
결과:
./.bash_history ./[email protected]:~#
최근 10분 이내에 액세스한 디렉토리:
find . -amin -10 -type d
특정 권한과 일치하는 파일 찾기
구문:
$ find -perm mode
여기서 'mode'는 '644', '655', '700', '777'과 같은 숫자 또는 'u=x', 'a=r+x'와 같은 문자 권한입니다.
모드를 지정하는 세 가지 방법은 다음과 같습니다.
- 지정된 정확한 권한을 가진 파일만 찾으려면 접두사를 사용하지 않습니다.
- 최소한 지정된 권한을 가진 파일을 찾으려면 '-' 접두사를 사용합니다. 이 경우, 지정된 권한 외에 더 높은 권한을 가진 파일도 결과에 포함됩니다.
- '/'를 사용하려면, 파일에 대한 권한이 있는 소유자 또는 그룹을 지정해야 합니다.
권한이 777인 파일 찾기
find -perm 777
결과:
./file1
766 이상인 파일 찾기
find -perm -766
결과:
./file2 ./file1
이 명령어는 다음 조건을 만족하는 모든 파일을 찾습니다.
- 파일 소유자는 읽기, 쓰기, 실행 권한을 가집니다.
- 그룹은 읽기, 쓰기 권한을 가집니다.
- 다른 사용자는 읽기, 쓰기 권한을 가집니다.
따라서, 이 기준을 충족하는 'file1'과 'file2' 두 개의 파일이 반환됩니다. 파일은 정확히 '766' 권한을 가질 필요는 없으며, 추가 권한을 가질 수도 있지만, 최소한 지정된 권한을 포함해야 합니다.
소유자가 쓰기 가능한 파일 찾기
이제 '/'를 사용하여 소유자, 그룹 또는 다른 사용자가 쓸 수 있는 파일을 검색합니다.
find -perm /222 .
./file2 ./file3 ./file1
위 명령어는 소유자나 그룹이 쓸 수 있는 파일을 찾습니다. 이 명령어는 둘 중 하나만 쓰기 권한이 있어도 파일을 반환하지만, 반드시 둘 다 쓰기 권한을 가질 필요는 없습니다. 둘 다 쓰기 권한이 있는 파일을 확인하려면 '-' 접두사를 사용하세요.
find -perm -220
결과:
./file2 ./file1
사용자가 소유한 파일 찾기
'jack' 사용자가 소유한 모든 파일 찾기:
find /home -user jack
결과:
/home/jack /home/jack/examples.desktop /home/jack/.gnupg /home/jack/.gnupg/private-keys-v1.d /home/jack/ans.cgi
사용자가 소유한 특정 파일 찾기
'jack' 사용자가 소유한 모든 텍스트 파일 찾기:
find /home -user jack -iname "*.txt"
결과:
/home/jack/docs/file32.txt
권한과 함께 파일 및 디렉토리 찾기 및 나열
find -name "*.conf" | ls -l
결과:
total 120 drwxr-xr-x 2 root root 4096 Dec 31 13:19 backup2 drwxr-xr-x 2 root root 4096 Jan 4 11:57 Desktop drwxr-xr-x 2 root root 4096 Dec 31 11:50 Documents drwxr-xr-x 2 root root 4096 Dec 31 12:27 Downloads -rw-r--r-- 1 root root 0 Jan 4 12:02 file22.doc drwxr-xr-x 2 root root 4096 Jan 4 12:14 file23 -rw-r--r-- 1 root root 0 Jan 4 12:23 file23.txt
결과를 찾아 작업 수행하기
이 섹션에서는 find 명령어로 특정 패턴과 일치하는 파일에 대해 작업을 수행하는 방법을 알아봅니다.
파일 찾기 및 권한 변경
특정 파일 형식의 권한을 찾아서 변경합니다. 여기서는 서로 다른 권한을 가진 PHP 파일에 대해 작업합니다.
[email protected]:~/ver$ ls -la total 8 drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 . drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 .. -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 base.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 qust.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 vary.php
이제 위에서 찾은 모든 PHP 파일의 권한을 755로 변경합니다.
find ver -name "*.php" -type f -exec chmod 755 {} ;
이 명령은 'ver' 디렉토리에서 PHP 파일을 찾아 해당 권한을 755(rwxr-xr-x)로 설정합니다.
결과:
[email protected]:~/ver$ ls -la total 8 drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 . drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 .. -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 base.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 qust.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 vary.php
파일 및 디렉토리 권한 찾기 및 변경
권한이 644인 파일을 찾아 655로 변경합니다.
find . -type f -perm 644 -exec chmod 655 {} ;
권한이 644인 디렉토리를 찾아 755로 변경할 수도 있습니다.
find . -type d -perm 644
결과:
./docs
'docs' 폴더의 권한이 644인 것을 확인할 수 있습니다.
drwxrwxr-x 2 jack jack 4096 Jan 3 12:45 docs
이제 755로 설정하기 위해 다음을 실행합니다.
find . -type d -perm 644 -exec chmod 755 {} ;
755로 변경되었는지 다시 확인해 볼 수 있습니다.
find . -type d -perm 755
결과:
. ./docs
위 결과를 보면 root와 docs 디렉토리에 755 권한이 설정되었음을 확인할 수 있습니다.
'ls -la' 명령어는 다음과 같은 세부 정보를 제공합니다.
drwxr-xr-x 2 jack jack 4096 Jan 3 12:45 docs
파일 또는 디렉토리 찾기 및 복사
특정 파일을 찾아 디렉토리에 복사합니다.
다음 명령어는 'file22.txt' 파일을 찾아 '~/tmp/images' 디렉토리에 복사합니다.
find -iname file22.txt -exec cp {} ~/tmp/images ;
특정 형식의 파일을 찾아 디렉토리에 복사합니다.
현재 디렉토리에서 확장자가 'jpg'인 이미지 파일을 찾아 다른 위치에 복사하려면 다음과 같이 합니다.
find -iname '*.jpg' -exec cp {} ~/tmp/images ;
이 명령은 모든 JPG 파일을 찾아 '~/tmp/images' 폴더에 복사합니다.
하나의 파일을 찾아 여러 디렉토리에 복사
하나의 파일을 여러 디렉토리에 복사합니다.
find ~/tmp/dir1/ ~/tmp/dir2/ $HOME/3/ -maxdepth 0 -exec cp ~/numeric/hci {} ;
이 명령은 'hci' 파일을 찾아 '/tmp/dir1/', '/tmp/dir2/', '$HOME/3/' 세 개의 디렉토리에 복사합니다.
파일 찾기 및 다른 디렉토리로 이동
알려진 파일을 한 디렉토리에서 다른 디렉토리로 이동합니다. 'universal.php' 파일을 이동하려면 다음과 같이 합니다.
find ~/folder/ -type f -name universal.php -exec mv {} ~/numeric/ ;
특정 확장자를 가진 파일을 찾아 다른 폴더로 이동합니다.
find ~/numeric/ -type f -name '*.php' -exec mv {} ~/folder/ ;
특정 파일을 찾아 다른 특정 폴더로 이동
find -type f -name uni*.* -exec mv {} ~/unifiles/ ;
이 명령어는 이름이 'uni'로 시작하고 확장자를 가진 모든 파일을 찾아 '/unifiles/' 디렉토리로 이동합니다.
수정 시간에 따라 파일 찾기 및 이동
지정된 날짜보다 오래된 파일을 찾아 'archive'와 같은 다른 위치로 이동합니다.
find /path/ -type f -name '*.pdf' -mtime +20 -exec mv {} /backup1/ ;
이 명령어는 20일이 지난 PDF 파일을 찾아 'backup1' 디렉토리로 이동합니다.
파일 및 디렉토리 찾기 및 삭제
현재 디렉토리에서 파일 또는 디렉토리를 찾아 제거하는 구문은 다음과 같습니다.
파일만 삭제:
find . -type f -name "삭제할_파일" -exec rm -f {} ;
디렉토리만 삭제:
find . -type d -name "삭제할_디렉토리" -exec rm -rf {} ;
특정 파일만 찾아서 삭제
'til'로 시작하는 파일을 찾아 삭제하려면 다음을 사용합니다.
find . -type f -name "til*" -exec rm {} ;
'til'로 시작하는 디렉토리를 찾아 삭제하려면:
find . -type d -name "til*" -exec rm {} ;
파일과 디렉토리 모두 제거
find . -name "til*" -exec rm -rf {} ;
이 명령어는 'til' 문자로 시작하는 파일과 디렉토리를 모두 삭제합니다.
확장자로 삭제
다음은 현재 디렉토리에서 모든 TXT 파일을 찾아 삭제하는 방법입니다. 'txt'를 'bak', 'pdf' 또는 제거하려는 다른 확장자로 바꾸십시오.
find . -type f -name "*.txt" -exec rm -f {} ;
각 파일을 삭제하기 전에 시스템에서 확인 메시지를 표시하려면 아래와 같이 '-i' 옵션을 추가하세요.
find . -type f -name "*.txt" -exec rm -i {} ;
결과:
rm: remove regular empty file './File22.txt'? y rm: remove regular empty file './file22.txt'? y rm: remove regular empty file './file23.txt'?
기본적으로 '-rm'은 디렉토리를 제거하지 않으므로, 재귀적 제거를 보장하기 위해 '-r' 옵션을 사용해야 합니다. 이렇게 하면 빈 디렉토리와 파일이 포함된 디렉토리를 모두 삭제할 수 있습니다. '-f' 옵션은 강제로 삭제하며 파일과 디렉토리 모두에 사용됩니다.
n일보다 오래된 파일 찾기 및 삭제
현재 디렉토리에서 20일이 지난 백업 파일을 찾아 삭제합니다.
find . -type f -name '*.bak' -mtime +20 -exec rm {} ;
이 명령은 20일이 지난 모든 '.bak' 파일을 삭제합니다.
디렉토리만 찾아 삭제
'dir22'라는 디렉토리를 삭제하려면:
find . -type d -name dir22 -exec rm -rf {} ;
디렉토리 이름의 대소문자가 일치하는지 확인하거나 '-iname' 옵션을 사용합니다.
find . -type d -iname Dir22 -exec rm -rf {} ;
'Dir22'와 'dir22'를 모두 제거합니다.
삭제하기 전에 확인하려면 '-i' 옵션을 사용하십시오.
find . -type d -iname Dir22 -exec rm -rf -i {} ;
결과:
rm: remove directory './Dir22'? n rm: remove directory './dir22'? y
위 예시에서 삭제하지 않을 디렉토리 'Dir22'에 대해 'n'을 입력하고, 이제 삭제될 'dir22'에 대해 'y'를 입력했습니다.
빈 파일 찾기 및 제거
다음 명령어 중 하나를 사용하여 빈 파일을 찾아서 자동으로 삭제할 수 있습니다.
find ./ -type f -size 0 -exec rm -f {} ;
또는
find ./ -type f -size 0 | xargs rm -f
또는
find ./ -type f -size 0 --delete
빈 디렉터리 찾기 및 제거
빈 디렉토리를 제거하려면 'd' 옵션을 사용합니다.
find ./ -type d -empty -exec rmdir {} ;
또 다른 대안은 제거 대신 '--delete'를 사용하는 것입니다.
find ./ -type d -empty --delete
컴퓨터에서 시스템 또는 중요한 파일을 삭제하면 운영 체제 또는 응용 프로그램이 손상되거나 중요한 데이터가 손실될 수 있습니다.
우발적인 삭제를 방지하려면, 루트가 아닌 사용자 계정을 사용하는 것이 가장 좋습니다. 또한, 삭제할 파일이 올바른지 확인하고, 만일의 경우를 대비하여 모든 데이터 파일을 백업했는지 확인해야 합니다.
향후 계획
계속해서 실험실 또는 비생산 환경에서 위의 리눅스 find 명령어를 시도해보세요. 일부 명령어를 사용하여 Crontab을 활용하여 파일 시스템 정리를 자동화할 수 있는지 확인해 보십시오. 리눅스 마스터를 위한 온라인 코스도 고려해 보세요.