CHashtag

[Linux] rm, rmdir Directory not empty 해결방법, 폴더 제거하기 본문

OS/Linux

[Linux] rm, rmdir Directory not empty 해결방법, 폴더 제거하기

HyoSeong 2022. 1. 16. 22:31
반응형
rmdir: failed to remove 'someDir': Directory not empty

안녕하세요.

 

저는 최근 ubunut에 발을 들이기 시작했는데요,

 

Windows와 많이 달라서 적잖아 당황을 하는 중입니다 ㅋㅋ

하지만 점점 익숙해지고 있고, 언젠가 실무에서 편안하게 Linux환경에서 개발할 날을 기대하며 공부를 하고 있습니다.

ㅋㅋ

 

아무튼, 공부를 하던 도중 폴더를 지울 일이 생겼습니다.

 

그래서 rmdir 명령어를 사용하려 했지만, 아래와 같이 실패했습니다.

$ rmdir someDir/
rmdir: failed to remove 'someDir/': Directory not empty

 

someDir안에 다른 폴더들도 존재했거든요.

 

그래서 저는 내부 폴더, 혹은 파일까지 재귀적으로 삭제해주는 arguments를 찾아보았습니다.

 

$ rmdir --help
Usage: rmdir [OPTION]... DIRECTORY...
Remove the DIRECTORY(ies), if they are empty.

      --ignore-fail-on-non-empty
                  ignore each failure that is solely because a directory
                    is non-empty
  -p, --parents   remove DIRECTORY and its ancestors; e.g., 'rmdir -p a/b/c' is
                    similar to 'rmdir a/b/c a/b a'
  -v, --verbose   output a diagnostic for every directory processed
      --help     display this help and exit
      --version  output version information and exit

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report rmdir translation bugs to <https://translationproject.org/team/>
Full documentation at: <https://www.gnu.org/software/coreutils/rmdir>
or available locally via: info '(coreutils) rmdir invocation'

 

하지만 rmdir에는 재귀적으로 제거하는 인자는 존재하지 않았습니다.

분명 은연중 누군가가 사용하는걸 봤던 것 같은데 말이죠 ㅋㅋ

 

그래서 찾아보았더니, rmdir이 아닌 rm명령어를 사용해야 한다는 사실을 알게 되었습니다.

 

$ rm --help
Usage: rm [OPTION]... [FILE]...
Remove (unlink) the FILE(s).

  -f, --force           ignore nonexistent files and arguments, never prompt
  -i                    prompt before every removal
  -I                    prompt once before removing more than three files, or
                          when removing recursively; less intrusive than -i,
                          while still giving protection against most mistakes
      --interactive[=WHEN]  prompt according to WHEN: never, once (-I), or
                          always (-i); without WHEN, prompt always
      --one-file-system  when removing a hierarchy recursively, skip any
                          directory that is on a file system different from
                          that of the corresponding command line argument
      --no-preserve-root  do not treat '/' specially
      --preserve-root[=all]  do not remove '/' (default);
                              with 'all', reject any command line argument
                              on a separate device from its parent
  -r, -R, --recursive   remove directories and their contents recursively
  -d, --dir             remove empty directories
  -v, --verbose         explain what is being done
      --help     display this help and exit
      --version  output version information and exit

By default, rm does not remove directories.  Use the --recursive (-r or -R)
option to remove each listed directory, too, along with all of its contents.

To remove a file whose name starts with a '-', for example '-foo',
use one of these commands:
  rm -- -foo

  rm ./-foo

Note that if you use rm to remove a file, it might be possible to recover
some of its contents, given sufficient expertise and/or time.  For greater
assurance that the contents are truly unrecoverable, consider using shred.

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report rm translation bugs to <https://translationproject.org/team/>
Full documentation at: <https://www.gnu.org/software/coreutils/rm>
or available locally via: info '(coreutils) rm invocation'

 

 

따라서 저는 아래 명령어를 통해 폴더를 성공적으로 제거할 수 있었습니다.

$ rm -r someDir/

 

그렇다면 rm과 rmdir의 차이는 무엇이며, 어떤 상황에서 어떤 명령어를 사용하는것이 옳바를까요? (command 개발자의 의도일까요?)

 

rm, rmdir


사실 위에 --help를 자세히 들여다보시면 답이 있습니다.

 

rm은 파일을 제거하는 것이고, rmdir은 폴더를 제거하는 것입니다.

 

그래서 -r인자없이 아래 명령어를 실행하면 실패하게 되는 것이죠.

$ rm someDir/
rm: cannot remove 'someDir/': Is a directory

 

Linux에서는 rm -r인자를 다음과 같이 정의하였습니다.

-r, -R, --recursive   remove directories and their contents recursively

 

분명 rm명령어는 파일을 제거해야 하는데 말이죠. (그래서 뒤에 (s)를 붙여놨나 봅니다.)

$ rm --help
Usage: rm [OPTION]... [FILE]...
Remove (unlink) the FILE(s).

...

 

나름 해석을 해보자면, rmdir은 "폴더" 만을 지우도록 설계되었고,

rm은 복수개의 파일을 지우도록 설계된것이 아닌가 싶습니다.

 

.net에서는 Directory.Delete 함수에 recursive 옵션이 있어서 더 어색해 보이네요.

https://docs.microsoft.com/en-us/dotnet/api/system.io.directory.delete 

 

Directory.Delete Method (System.IO)

Deletes a specified directory, and optionally any subdirectories.

docs.microsoft.com

rmdir에 -r 인자가 있으면 안될 다른 이유가 있었던 것일까요,

관련해 아시는게 있으신 분은 댓글 부탁드립니다 ㅎㅎ

 

 

아무튼, 이렇게 rm과 rmdir에 대해 알아보았는데요,

오늘도 글 봐주셔서 감사합니다.

 

도움이 되었길 바랍니다.

반응형

'OS > Linux' 카테고리의 다른 글

Linux 입문자를 위한 각종 명령어 모음  (0) 2022.02.20