본문 바로가기
Linux

[Linux] 특정 조건의 파일들 찾아 특정 명령어 적용하기 : find -exec

by ds31x 2023. 10. 22.

특정 조건의 파일들 찾아 특정 명령어 적용하기 : find -exec

find 의 수행시 명령어 구성은 다음과 같음.

find [검색 시작 경로] [옵션] [조건] [행동]

 

여기서 -exec는 "[행동]"을 지정하는 하나로

"[조건]"으로 검색된 파일들을 지정한 명렁의 argument로 넘겨주어 실행하게 됨.

 

다음은 좀 더 상세히 -exec 를 사용하는 경우를 보여줌.

find <검색시작경로> <옵션> <조건> -exec <실행시킬_명령어> {} \;
  • -exec 옵션은 exec를 이용하여 새로운 프로세스 <실행시킬_명령어>를 수행시키게 됨.
  • 해당 새로운 프로세스를 실행시킬 때 <실행시킬_명령어>에 argument(인자)로 넘겨지는 것은
  • 앞의 find <조건>으로 찾아진 파일들임.
  • 맨 뒤의 \; 은 escape sequence로 ;를 나타내며, shell에서 semicolon ;으로 명령어의 끝을 나타내는 용도로 사용됨.
    • shell에서 semicolon ;은 command separator로
    • 명령어들을 구분하는데 사용되므로
    • find 의 옵션 -exec 로 실행되는 각각의 명령의 끝을 기재하기 위해 사용됨.
    • find 로 찾아지는 파일들이 여러 개일 경우, 이들 각각을 argument 로 하여 -exec 로 지정된 명령어가 여러번 실행되게 되는데 이들간이 독립되어 수행되도록 사이에 ; 이 들어가도록 처리한 것임.
  • -exec 옵션에 command seperator ; 를 literal로 넘겨줘야하므로, escape sequence로 \; 로 넘겨줘야함.
    • escape sequence로 넘겨주지 않을 경우, shell 에서 현재 명령 수행의 command separator로 처리하여 정상 수행되지 못함.
    • 반드시 escape sequence를 이용하여 문자 ;find에 넘겨져야 -exec 로 수행되는 해당 명령들이 각각 종료되므로 \;로 기재해야 함.

예제.

#! /bin/env zsh

targets=$(find . -name '*.txt' -exec basename {} \;)
for cfname in ${targets}; do
    cp ./${cfname} ./${cfname}.txtn
done
  • 현재 디렉토리에서 .txt로 끝나는 파일들을 찾고
  • basename으로 순수파일명(확장자포함)만을 추출하여 변수 targets로 넘김.
  • 이후 이들을 카피본을 .txtn 확장자를 추가하여 남김.

{}find에서 찾은 파일들을 의미함 (반드시 붙여서 기재해야함)

 

위의 예제처럼 변수 targets의 값을 설정할 때 command substitution 을 사용함.

 

이 _command substitution_에 대해선 다음 URL을 참고.

2023.10.01 - [Linux] - [Shell] command substitution

 

[Shell] command substitution

우리나라말로 명령어 치환 이라고 불리며, 특정 명령어의 수행결과를 문자열로 입력받는 형태로 셀프로그래밍 등에서 사용됨. command substition 사용법 아래 예제는 result.txt 를 현재 날짜 정보를

ds31x.tistory.com

 

728x90