• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    해결됨

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

23.02.06 20:46 작성 23.02.06 20:59 수정 조회수 1.16k

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

안녕하세요. 서진휘님

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를 이용하는 편이 더 좋은 방법일 것 같습니다.

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