rm은 빈 디렉토리를 재귀 적으로 제거 할 수 있습니까?


9

이전 버전의 Unix에서는 rm명령이 디렉토리가 비어 있으면 삭제합니다. rm에 대한 Research Unix Eighth Edition 매뉴얼 페이지에서 : "항목이 디렉토리이면 비어있는 경우에만 제거됩니다." 나는이 별칭을 가지고 내가이 동작 같은, 그래서 내 /etc/profile: alias rm='rm -d'내가 명령의 GNU로 coreutils 버전을 사용하고 rm있는, -d알 수 rm있는 거 빈 그들이 경우에 가서 제거 디렉토리에 있습니다.

여태까지는 그런대로 잘됐다. 이 별칭을 사용 rm하면 예전처럼 사용할 수 있습니다 . 그러나 한 걸음 더 나아가고 싶습니다. 내가 좋아하는 것rm디렉토리가 다른 디렉토리를 포함하는 경우에도 디렉토리가 유일한 디렉토리 인 경우 디렉토리를 삭제합니다. 디렉토리 구조가 얼마나 깊지는 중요하지 않습니다. 파일이 없으면 비어있는 (한 번 맨 아래에 도착하면) 디렉토리를 rm모두 제거하고 싶습니다 .

이것은 여전히 ​​일반으로 작동 rm하고 전달 된 파일을 삭제 하는 별명으로 작성 될 수 있습니까?


어때요 rmdir -p?
Kevin

제안 Kevin에게 감사드립니다. 그러나 이것은 내가 찾고있는 행동이 아닙니다. 을 실행하면 mkdir -p a/b1/c2 && mkdir -p a/b2/c2; rmdir -p a/b1/c1;여전히 a, a / b2 및 a / b2 / c2가 남습니다. 내가 원하는 것은 최상위 수준 (이 경우 a)을 rm에 전달하고 아래에있는 모든 것을 제거하는 것입니다.
WhiteHotLoveTiger

답변:


8

디렉토리 트리를 탐색하고 디렉토리 이외의 것이 포함되어 있는지 확인하십시오. 이것은 rm능력을 넘어선 것 입니다. 와 같은 다른 도구가 필요합니다 find. 이 방법으로 지정된 디렉토리 아래의 빈 디렉토리를 삭제할 수 있습니다 (비워진 -depth상위 디렉토리도 삭제됨).

find "$x" -depth -type d -exec rmdir {} +

디렉토리가 아닌 파일이거나 디렉토리 이외의 것을 포함하지 않는 디렉토리 트리 인 경우 각 인수에 대해 인수를 삭제하는 함수가 있습니다. 이 함수는 원자 적이 지 않습니다. 실행 중 인수 중 하나가 변경되면 오류 메시지가 표시 될 수 있지만 인수로 전달 된 디렉토리 내의 디렉토리가 아닌 디렉토리를 삭제하지 않는 것이 안전합니다.

rm () {
  ret=0
  for x; do
    case $x in -*) x=./$x;; esac
    if [ -d "$x" ]; then
      if [ -n "$(find "$x" ! -type d | head -n 1)" ]; then
        echo 1>&2 "$x: non-empty directory tree"
        ret=2
      else
        find "$x" -depth -exec rmdir {} +
        if [ -d "$x" ]; then ret=2; fi
      fi
    else
      command rm "$x" || [ $ret -gt 1 ] || ret=2
    fi
  done
  return $ret
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.