인프런 커뮤니티 질문&답변

지니님의 프로필 이미지
지니

작성한 질문수

리눅스 커맨드라인 툴 (Full ver.)

파일 좀 찾아줘 - find

특정 디렉토리를 제외하고 삭제가 가능할까요?

해결된 질문

작성

·

1.5K

·

수정됨

0

home 디렉토리 밑에 a, b, c, d, e 디렉토리가 있고

각 디렉토리 밑에는 a1,a2,a3,a4,a5, ......, a100

와 같이 100개의 디렉토리가 있다고 할때,

디렉토리 c , 디렉토리 c33, c33안에 들어있는 파일 을 제외하고 모두 삭제 할 수 있을까요?

(각 디렉토리는 모두 파일을 가지고 있음)

 

저는 아래와 같이 생각했는데 원하는대로 안될것 같고 더 좋은 방법이 있을꺼같아 질문드립니다.

find /home/c/* ! -name "c33" -exec rm -r {} \;

rm -r home/a

rm -r home/b

rm -r home/d

rm -r home/e

 

 

답변 1

2

런잇(ProgCoach4U)님의 프로필 이미지
런잇(ProgCoach4U)
지식공유자

안녕하세요. 서진휘님

rm 명령어에 특정 패턴에 매치하는 파일에 대해 예외 처리하는 옵션이 없기 때문에 find와 같은 다른 툴을 이용하시는 것이 타당한 방법입니다. 그래서 아래와 같이 커맨드라인을 만들어봤습니다.

find $(pwd)/{a,b,c,d,e} -type d -not \( -path "$(pwd)/c" -or -path "$(pwd)/c/c33" \) | xargs rm -rf

현재 디렉터리의 a, b, c, d, e 이하의 디렉터리에 대해 directory이면서 c와 c/c33을 제외한 디렉터리 목록을 만들어 rm 명령어의 입력으로 넣어주는 방법을 선택했습니다. find의 exec를 사용하면 디렉터리를 찾는 중간에 디렉터리를 삭제하게 되어 에러 메시지가 발생해 xargs를 이용하도록 했습니다.

한 줄에 목적하는 바를 이루었지만, 음.. 썩 좋아보이진 않네요. 한 줄에 원하는 명령어를 만드는 것도 중요하긴 하지만 readability도 좋지 않고, 코드를 유지보수하는 관점에서도 좋은 것 같지 않아서요. 차라리 코드를 여러 줄 작성하더라도 bash script를 이용하는 편이 더 좋은 방법일 것 같습니다.

답변이 늦어져 죄송합니다~

지니님의 프로필 이미지
지니

작성한 질문수

질문하기