본문 바로가기

Cygwin

find 명령의 -exec 옵션을 이용해 파일 삭제

프로젝트를 하다 보면 종종 디렉토리 여기 저기에 지우고 싶은 파일들이 생기는 경우가 있습니다. 저 같은 경우 vim 을 많이 쓰기 때문에 .swp (.파일이름.swp의 이름을 갖는 임시 저장 파일) 들이 종종 남는 경우들이 있습니다.


이런 파일들은 탐색기에서 찾아서 지울 수도 있지만, find 명령으로 찾아 지우는 것도 괜찮은 방법입니다.


기본적으로 find 명령으로 파일을 찾는 것은 다음처럼 하면 됩니다.

현재 디렉토리 아래에 확장자가 java인 이름의 파일을 찾아서 화면에 출력하라.. 라는 의미네요.


find . -name "*.java" -print


name 대신 type 같은 것도 종종 쓰지만 대부분 name을 많이 씁니다. 

그리고, 요새는 -print를 안붙여도 기본적으로 화면에 보여주는 것 같던데 예전에는 무조건 -print를 붙여야 했습니다.


이 -print 부분이 파일을 찾은 후 할 동작을 지정하는 부분입니다. -print는 말 그대로 화면에 출력을 의미하지요.


-print대신 -exec를 사용하면 원하는 명령을 실행할 수 있습니다. 

여기서 하고 싶은 동작은 파일을 삭제하는 것이니 rm 명령을 사용하면 됩니다. 

-exec를 사용할 때 중요한 2가지는

1) rm 명령에 지울 파일을 지정해줘야 하는데 이 때 find가 찾은 파일이라는 의미로 {} 를 사용하고,

2) 유닉스 명령이 어디까지 인지를 \; 로 알려줍니다.


즉, 다음처럼 진행하면 .으로 시작하고 .swp 확장자를 갖는 모든 파일을 찾아 rm 명령의 인수로 주게 됩니다.


find . -name ".*.swp" -exec rm {} \;


Unix 답게 성공적으로 수행하게 되면 아무런 결과도 보여주지 않습니다.

이 때 실수로 -name "*" 이런 식으로 모든 파일에 대해서 지워 버릴 수 있는 점에 주의하세요.


또, -exec 뒤에 붙는 명령에 대해서는 alias가 적용되지 않습니다. 예를 들어 .bashrc에 alias rm='rm -i' 와 같이 파일 삭제 전에 매번 확인을 요청하도록 설정해놨어도 find 명령의 -exec에서는 동작하지 않고 (즉, 묻지 않고) 바로 삭제 하게 됩니다. 이를 방지하려면 -exec rm -i {} \; 와 같이 직접 써주면 됩니다.


마지막으로 동일 이름의 디렉토리들과 그 아래 파일들까지 지우는 것을 보도록 하겠습니다.

예전 svn의 경우 프로젝트의 모든 디렉토리에 .svn 디렉토리를 만들고 그 아래 파일이 몇 개 있었던 구조인데 그런 경우

에 -rf 옵션으로 디렉토리와 함께 내부 파일들까지 전부 삭제할 수 있습니다.


find . -name ".svn" -exec rm -rf {} \;


'Cygwin' 카테고리의 다른 글

find 명령으로 전체 소스의 라인 수 세기  (1) 2017.01.16
Cygwin 드라이브 이동 방법  (3) 2017.01.13
Cygwin 신규 패키지 설치  (1) 2017.01.11
Cygwin 설정  (0) 2017.01.11
Cygwin 다운로드 및 설치  (2) 2017.01.05