특정 조건의 파일들 찾아 특정 명령어 적용하기 : 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
로 지정된 명령어가 여러번 실행되게 되는데 이들간이 독립되어 수행되도록 사이에;
이 들어가도록 처리한 것임.
- shell에서 semicolon
-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
'Linux' 카테고리의 다른 글
[zsh] 변수 여부 체크하고 없으면 다른 값 할당하기 : ${val0:-val1} (1) | 2023.10.25 |
---|---|
[Linux] SystemV, BSD, 그리고 Linux 간략 역사 (0) | 2023.10.23 |
[Linux] SIGNAL 에 대한 요약 정리. (0) | 2023.10.22 |
[Linux] 현재 shell 또는 session의 관련 process들 확인하기 : jobs (0) | 2023.10.22 |
[Bash] 입출력 목적지 변경하기 : Redirection Operation (1) | 2023.10.02 |