본문 바로가기

Linux

Linux 특정 디렉토리에서 찾고자 하는 모든 파일을 삭제 하는 법


윈도우에서는 이러한 일을 하려면 아예 포기하거나, 특정 유티리티를 사용하여 삭제를 해야 한다.
하지만 Linux 에서는 이러한 일을 수행할 수 있는 강력한 명령어들을 제공한다.

하나의 명령어로 이러한 일을 하는 것은 안되고, 두 개의 명령어를 조합하여 수행할 수 있다.
먼저 특정 파일을 찾아야 하는 것이므로, find 명령어를 사용하면 되겠고, find 로 찾은 파일들을 삭제 하여야 하니, rm 명령어를 사용하면 될 것이라고 생각이 된다. 그리고 이 두 명령어를 묶어 주는 어떤 매개체가 필요하다는 사실도 알 수 있다.

그래서 명령어의 조합이 두 개 정도로 나올 수 있는데, 아래와 같이 수행할 수 있다.

1. find 와 xargs 를 조합
find 디렉토리 -name 파일이름 | xargs -0 rm

예)  $ find . -name "a*" -print0 | xargs -0 rm

위의 예에서는 파일 이름이 정규식을 포함할 수 있다는 것을 알 수 있다. 더 자세한 사항은 find manual 을 참조하면 되겠다. :)
xargs -0 옵션은 무슨일을 하게 하는 것이냐면, 아래와 같이 xargs 메뉴얼 페이지를 보면 알 수 있다. 말 그대로 find 명령어에서 -print0 옵션과 같이 사용할 때 사용하는 것인데, ascii NULL 케릭터 \0 을 스페이스나, newline 케릭터들대신 인자들의 구분자로 사용하겠다는 의미이다. 여기서 굳이 이렇게 옵션을 준 이유는 디렉토리 경로가 빈 공백을 포함하거나, 파일 이름이 white space 를 포함할 수 있기 때문에 정확한 동작을 수행하려면 이런 옵션들을 넣어 주어야 한다.

$ man xargs
...
-0      Change xargs to expect NUL (``\0'') characters as separators, instead of spaces and newlines.  This is expected to be used in concert with the -print0 function in find(1).
...
 
 

2. find 와 -exec 를 조합
find 디렉토리 -name 파일이름 -exec rm {} \;
예) $ find . -name "a*" -exec rm {} \; 

위에서는 find 명령어가 실행된 결과 (standard out) 을 -exec 의 인자로 넘겨주어서 삭제 명령을 실행하는 명령어이다.
"{}" 은 앞에 명령어가 실행된 결과를 의미한다. 즉 find 명령어를 실행하면 표준출력으로 결과들이 쭉 나열되는데, 이 것들을 rm 의 인자값들로 넣어서 차례대로 삭제 명령어를 수행하게 된다.
; (세미콜론) 은 보통 쉘에서 한라인씩 처리할때 사용하는 케릭터 인데, 이것을 방지하기 위해서 Escape 케릭터인 \ 을 붙여주어서 우리가 원하는 명령을 수행할 수 있도록 한다.

이러한 tricky 한 부분도 세심하게 배려된 Linux  명령어들과 메뉴얼페이지가 참 멋있다고 느껴지는 날이다.