rm 명령어에 대하여

lovemyin의 이미지

안녕하세요. 한가지 질문이 있어 글을 올립니다.

디렉토리에 여러 파일들이 있는데 제가 원하는 파일 하나만 제외하고 모두 지우고 싶을때는
어떤 방법으로 해야하나요.
rm 명령어를 사용해서 지우고 싶습니다.

thisrule의 이미지

원하는 파일 이름이 abc 라면 아래와 같이 하시면 됩니다.
rm `ls | grep -v abc`

musiphil의 이미지

`...`를 이용하는 방법은 파일 이름에 공백이 있는 경우 제대로 동작하지 않을 가능성이 높습니다.

$ touch "abc" "who am i"
$ rm `ls | grep -v abc`
rm: cannot remove `who': No such file or directory
rm: cannot remove `am': No such file or directory
rm: cannot remove `i': No such file or directory

따라서, 제대로 하려면 find를 이용하는 것이 좋습니다.

$ find . -maxdepth 1 -type f -not -name "abc" -exec rm '{}' ';'
혹은
$ find . -maxdepth 1 -type f -not -name "abc" -print0 | xargs -0 rm

보기엔 복잡하지만 그리 어렵지는 않습니다. 쓸데없이 하위 디렉터리까지 뒤지는 것을 막기 위해 -maxdepth 1을 주고, 디렉터리가 아닌 일반 파일만 대상으로 하기 위해 -type f를 사용했습니다.
lovemyin의 이미지

감사합니다.

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

cinsk의 이미지

그리고 rm `...` 방식은 파일이 엄청나게 많을 경우 제대로 동작하지 않을 수도 있습니다.
이 경우, find 명령의 -path ... -prune과 -exec rm ...을 쓰는 방식으로 해결할 수 있습니다.


--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/