find -exec와 xargs 를 사용하여 검색 결과에 작업 실행하기
이 단계에서는 단순히 파일을 나열하는 것을 넘어, find 명령어로 찾은 파일에 대해 직접 명령어를 실행하는 방법을 배웁니다. 이는 권한 변경, 파일 삭제 또는 사용자 정의 스크립트 실행과 같은 대량 작업을 수행할 때 매우 강력한 기술입니다. find의 -exec 옵션과 xargs 명령어라는 두 가지 주요 방법을 다룹니다.
이전 단계에서 작업하던 ~/project/find_lab 디렉토리에서 계속 진행합니다. 먼저 올바른 디렉토리에 있는지 확인하세요.
cd ~/project/find_lab
find -exec 사용하기
-exec 옵션을 사용하면 find가 찾은 각 파일에 대해 임의의 명령어를 실행할 수 있습니다. 구문이 처음에는 다소 생소할 수 있습니다.
find [path] [expression] -exec [command] {} \;
[command]: 실행하려는 명령어 (예: ls -l, rm, chmod).
{}: 특수 플레이스홀더입니다. find는 현재 찾은 파일의 전체 경로로 {}를 대체합니다.
\;: -exec 명령의 필수 종료 문자입니다. 쉘이 세미콜론을 특수 문자로 해석하지 못하도록 백슬래시 (\) 가 반드시 필요합니다.
직접 시도해 봅시다. 확장자가 .txt인 모든 파일을 찾아 각 파일의 상세 정보를 확인하기 위해 ls -l을 실행해 보겠습니다.
find . -name "*.txt" -exec ls -l {} \;
출력 결과는 찾은 각 .txt 파일에 대해 ls -l이 실행된 결과를 보여줍니다.
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./file1.txt
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./report.txt
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./subdir/file3.txt
안전을 위해 find는 -ok 옵션을 제공합니다. 이는 -exec와 동일하게 작동하지만, 각 파일에 대해 명령어를 실행하기 전에 사용자에게 확인을 요청합니다. 파일 삭제 (rm) 와 같은 파괴적인 작업을 수행할 때 적극 권장됩니다.
앞서 생성한 .log 파일을 삭제해 보되, 이번에는 안전을 위해 -ok를 사용하겠습니다.
find . -name "*.log" -ok rm {} \;
파일을 찾을 때마다 find가 확인을 요청합니다. 삭제를 승인하려면 y를 입력하고 Enter 를 누르세요.
< rm ... ./file2.log > ? y
< rm ... ./subdir/another.log > ? y
확인 후 디렉토리 내용을 나열하여 파일이 삭제되었는지 확인할 수 있습니다.
ls -R
.:
File1.TXT file1.txt report.txt subdir
./subdir:
file3.txt
xargs 사용하기
-exec의 대안은 find의 출력을 xargs 명령어로 파이프하는 것입니다. xargs는 표준 입력 (여기서는 find가 제공하는 파일 경로) 에서 항목을 읽어 해당 항목들을 인자로 사용하여 지정된 명령어를 실행합니다.
xargs의 주요 장점은 효율성입니다. -exec ... \;는 모든 파일에 대해 명령어를 매번 실행하는 반면, xargs는 파일 경로들을 그룹화하여 한 번에 많은 인자를 전달함으로써 명령어 실행 횟수를 줄입니다.
먼저, 작업할 대상을 만들기 위해 방금 삭제한 로그 파일들을 다시 생성하겠습니다.
touch file2.log subdir/another.log
이제 find와 xargs를 사용하여 .log 파일의 상세 정보를 나열해 보겠습니다.
find . -name "*.log" | xargs ls -l
출력은 -exec 예제와 유사하지만 명령어 구조가 다릅니다.
-rw-r--r-- 1 labex labex 0 <date> <time> ./file2.log
-rw-r--r-- 1 labex labex 0 <date> <time> ./subdir/another.log
find -ok와 마찬가지로 xargs도 -p 옵션을 사용하여 "확인" 모드를 사용할 수 있습니다. 실행하려는 명령어를 표시하고 사용자에게 확인을 요청합니다.
이를 사용하여 .log 파일을 다시 삭제해 보겠습니다.
find . -name "*.log" | xargs -p rm
xargs는 파일들을 하나의 rm 명령어로 그룹화하고 확인을 요청합니다. y를 입력하고 Enter 를 누르세요.
rm ./file2.log ./subdir/another.log ?...y
이제 검색 결과에 대해 작업을 수행하는 두 가지 방법인 -exec와 xargs를 모두 성공적으로 사용해 보았습니다. 이는 리눅스에서 작업을 자동화하는 데 필수적인 기술입니다.