안녕하세요. 이번 시간에는 리눅스 find 명령어에서 -exec 옵션을 알아보겠습니다. 요약해서 말하자면, sql 파일들이 여러 개가 있을 때, 이 명령어를 잘 이용하면 여러 개의 sql file을 한 번에 적용시켜버릴 수 있습니다.

 


 먼저, find는 디렉토리에서 파일들을 찾기 위한 명령어입니다. 옵션이 매우 많지만, 실습을 위해서 필요한 몇 개만 추릴게요.

 

 -iname은 패턴에 매치되는 것을 찾습니다. case insensitive라는 것은 대소문자 구분이 없는 것을 의미합니다.

 

 

 다음에 -exec command {}입니다. -exec는, 실행을 시키는 옵션입니다. 여기서 string {}이 현재 처리중?인 파일로 대치된다는 말이 있습니다. 이게 무슨 소리인가?

 

 find -maxdepth 1 -iname "*.txt"를 입력해 보겠습니다. 그러면, ./2.txt와 ./1.txt가 뜹니다. 이 때, 1번째 줄에서의 처리중인 파일은 ./2.txt가 되고, 2번째 줄에서의 처리중인 파일은 "./1.txt"가 됩니다. 대충 요래 이해하시면 무난하지 않을까 싶어요. 이제, 예제들을 보겠습니다.

 


 find -maxdepth 1 -iname "*.txt" -exec wc {} \;가 있습니다. command의 끝은 ;로 구분합니다. 어떻게 해석하면 될까요? 일단, maxdepth라는 옵션은 1뎁스만 보겠다는 의미입니다. 저는 현재 test 디렉토리에서 작업하고 있으니, test만 봅니다. 그러면 아까와 같이 ./2.txt와 ./1.txt만 나오게 됩니다.

 

 이들에 대해, action을 수행합니다. wc {}를요. 이것이 수행할 command입니다. wc ./2.txt와 wc ./1.txt를 수행한 결과를 한 줄에 하나씩 출력하겠군요. 줄수, 라인수, 단어수 등이 나오게 됩니다. 이 정도만 아셔도 디렉토리 안에 있는 sql 파일들을 모두 읽어서 dump 시키는 작업을 매우 손쉽게 할 수 있겠습니다. 다음 예제는 현재 디렉토리의 모든 txt 파일에 대해서 12345를 덧붙이는 명령어를 작성하는 것입니다.

 

 다소 복잡한데요. sh 파일을 하나 작성합니다. echo 12345 >> $1입니다. 이 때 $1, $2는 1번째 인자, 2번째 인자 등을 의미합니다.

 

 이 파일의 실행 권한을 줍니다. 저는 755로 바꿨습니다. 다음에, -exec ./re.sh {} \;를 입력하시면 됩니다. 그러면 ./re.sh의 1번째 인자로 각각 ./2.txt와 ./1.txt가 들어가게 됩니다. 결국 sh에서는 $1이 ./2.txt와 ./1.txt로 치환이 될 것이니, 두 파일에 12345를 덧붙이게 되겠네요.

 

 실행 결과는 위와 같습니다. 그런데 복잡하지도 않은 거 같은 명령어 한 줄에 sh 파일 하나를 태울 필요가 있을까요? sh 파일 없이 하는 방법이 없을까요? sh 명령어를 이용하면 됩니다.

 

 

 1.txt와 2.txt를 새로 현재 작업 디렉토리에 새로 생성한 다음에 위 명령어를 실행해 봅시다. -exec 옵션에, sh -c "echo 67890 >> {}" \;를 적었습니다. 고로 저는 echo 67890 >> {} 커멘드를 읽어서 실행시키는 무언가의 shell을 실행시킵니다. 이 때 {}는 ./2.txt, ./1.txt 등으로 대치될 겁니다.

 

 실행이 제대로 되었는지 1.txt와 2.txt에 있는 내용을 볼까요? 보니 67890이 제대로 들어왔음을 볼 수 있습니다.