[linux] 리눅스 특정 파일 찾아서 지우기
- 2 mins리눅스 특정 파일 찾아서 지우기
컴퓨터를 쓰다보면 특정 파일을 찾아서 지우고싶을때가 있다.
예를들어 .log로 끝나는 파일을 모두 지우고싶다면 어떻게 해야할까?
현재 디렉토리가 다음과 같이 있다고 가정하자.
[itholic@linux ~]$ ls
dir_a dir_b dir_c dir_d dir_e dir_f
우선은 파일이 어디있는지 찾아야할것이다.
find 명령으로 다음과 같이 찾을 수 있다.
[itholic@linux ~]$ find ./ -name "*.log"
./dir_b/logs/debug_181112.log
./dir_b/logs/error_181113.log
./dir_b/logs/error_181116.log
./dir_c/logs/critical_181116.log
./dir_c/logs/debug_181112.log
./dir_c/logs/debug_181113.log
./dir_c/logs/debug_181115.log
./dir_c/logs/error_181112.log
./dir_e/logs/critical_181116.log
./dir_e/logs/debug_181115.log
./dir_e/logs/debug_181117.log
./dir_e/logs/debug_181118.log
./dir_e/logs/error_181112.log
log파일들은 현재 dir_b, dir_c, dir_e 에 나뉘어져 존재하는것을 확인했다.
서로 다른 경로에 산재해 있는 파일들을 일일이 지워야하자니 귀찮다.
물론 지금 상황은 일일이 지워도 별로 상관없는 정도의 파일 양이지만,
대개 실제상황에서 파일들은 이렇게 지우기 좋은 형태(?)로 존재하지 않는다.
특정 디렉토리의 하위디렉토리로 엄청나게 깊이 들어가야 찾을 수 있는 경우도 있고,
이런 경우에는 일일이 경로를 입력해서 지우는것도 일이다.
그런 경로들이 수십개가 존재한다면 그때부터는 본격적으로 머리가 아파진다.
특정 경로에 있는 특정 규칙의 이름을 가진 파일들을 한 번에 지울순 없을까?
다행히 방법이 있다.
find 명령어에 다음과 같이 -exec 옵션을 추가해주면 된다.
error, critical이 붙은 파일들은 원인 분석을 위해 지우면 안될 것 같으니,
debug로 시작하는 로그파일들만 지워보자.
[itholic@linux ~]$ find . -name "debug*.log" -exec rm {} \;
[itholic@linux ~]$ find . -name "*.log"
./dir_b/logs/error_181113.log
./dir_b/logs/error_181116.log
./dir_c/logs/critical_181116.log
./dir_c/logs/error_181112.log
./dir_e/logs/critical_181116.log
./dir_e/logs/error_181112.log
debug로 시작하는 log파일들이 전부 삭제된것을 확인할 수 있다.
find 명령으로 출력된 결과를 다시 -exec의 인자로 넘겨 rm 명령을 실행했다.
rm 뒤에 붙은 “{}”가 바로 출력된 결과들을 의미한다.
-exec 명령은 세미콜론(;)을 만날때까지 입력한 명령어들을 실행시키도록 되어있는데,
이스케이프 문자인 “\” 를 적어주지 않으면 세미콜론을 문자열이 아닌 유닉스 예약어로 인식한다.
참고로 유닉스 예약어로써 세미콜론의 역할은,
연속적으로 실행시킬 명령어를 한 줄로 적을때 구분자로 사용한다.
[itholic@linux ~]$ mkdir testdir; touch testdir/testfile; ls testdir/
testfile
-
testdir이라는 디렉토리를 만들고,
-
해당 디렉토리 안에 testfile이라는 파일을 만든 뒤,
-
testdir에 존재하는 리스트를 출력하는 일련의 명령을
세미콜론으로 구분하여 한 줄로 작성하였다.
내용추가 (181203)
find 명령어 자체에서 제공하는 -delete 옵션을 주면 훨씬 간단하고 빠르게 처리할 수 있다는 것을 알았다.
출처: https://unix.stackexchange.com/questions/167823/find-exec-rm-vs-delete
다만, 이것은 find의 버전에따라 지원하지 않는 경우도 있다고하니 유념하자.
다음과 같이 쓰면 된다.
find . -name "debug*.log" -delete
훨씬 간단해지고, 성능면에서도 유리하다고 한다.