Jump to content

rm (Unix)

This is a fully translated article. Click here for more information.
From DawoumWiki, the free Mathematics self-learning

rm
Original author(s)Ken Thompson, Dennis Ritchie
(AT&T Bell Laboratories)
Developer(s)Various open-source and commercial developers
Initial releaseNovember 3, 1971; 52 years ago (1971-11-03)
Operating systemUnix, Unix-like, V, Plan 9, Inferno, KolibriOS, IBM i
PlatformCross-platform
TypeCommand
Licensecoreutils: GPLv3+

컴퓨팅에서, rm (remove에 대한 줄임말)은 파일 시스템에서 컴퓨터 파일, 디렉터리심볼릭 링크와 같은 대상과 디바이스 노드, 파이프소켓과 같은 특수 파일을 제거하기 위해 사용되는 유닉스유닉스-계열 운영 시스템에서 기본 명령이며, MS-DOS, OS/2, 및 Microsoft Windowsdel 명령과 유사합니다. 그 명령은 EFI 쉘에서도 사용할 수 있습니다.[1]

Overview

rm 명령은 unlink 시스템 호출을 사용하여 파일 시스템에서 대상에 대한 참조를 제거하며, 여기서 그들 대상은 여러 참조를 가질 수 있고 (예를 들어, 두 개의 다른 이름을 가진 파일), 그 대상 자체는 모든 참조가 제거되고 어떤 프로그램도 여전히 대상에 대해 열린 핸들을 가지고 있지 않을 때 오직 버려집니다.

이것은 프로그램이 파일을 열고 파일 시스템에서 즉시 제거하고, 그런-다음 임시 공간으로 사용할 수 있는 시나리오에 대해 허용하며, 파일의 공간은 프로그램이 충돌에 의해 종료되더라도 그것이 종료된 후 회수될 것임을 알고 있습니다.

그 명령은 일반적으로 파일 데이터를 파괴하지 않는데, 왜냐하면 그것의 목적은 실제로 단순히 참조를 연결-해제(unlink)하는 것이고, 해제된 파일 시스템 공간은 제거된 파일에서 여전히 남은 데이터를 포함할 수 있기 때문입니다. 이것은 일부 경우에서 보안 문제가 될 수 있고, 강화된 버전은 때때로 마지막 링크가 절단될 때 데이터를 지우도록 제공하고, 특히 데이터 지우기 기능을 제공하는 shredsrm과 같은 프로그램을 사용할 수 있습니다.

rm은 전형적으로 휴지통과 같은 메커니즘을 통해 삭제된 파일 복구를 제공하지 않는, 일반적으로 오직 유닉스-파생 운영 시스템에서 볼 수 있고, 따라서 사용자가 실수로 파일을 삭제하는 것을 방지하기 위해 일종의 래퍼로 rm을 묶는 경향이 있습니다.

인덱스 재구성을 시도하고 부분이 재사용되지 않았으면 파일을 다시 되돌릴 수 있는 삭제 취소 유틸리티가 있습니다.

History

일부 오래된 유닉스의 버전에서, rm 명령은 디렉토리가 비어 있으면 삭제했습니다.[2] 이 행위는 4.4BSD-Lite2에서 파생된 BSD (예를 들어, FreeBSD,[3] NetBSD,[4] OpenBSD[5]macOS)와 같이 -d 플래그를 갖는 rm의 일부 버전에서 여전히 얻어질 수 있습니다.

GNU coreutils에 번들된 rm 버전은 Paul Rubin, David MacKenzie, Richard Stallman 및 Jim Meyering에 의해 작성되었습니다.[6] 이 버전은 호환성을 돕기 위해 -d 옵션도 제공합니다.[7] 같은 기능성이 표준 rmdir 명령에 의해 제공됩니다.

버전 7-i 옵션은 버전 1에서 데뷔한 dsw, 또는 "delete from switches"를 대체했습니다. Doug McIlroydsw가 "말할 수 없는 이름을 가진 파일을 정리하도록 설계된 절망적인 도구"라고 썼습니다.[8]

KolibriOSrm 명령의 구현을 포함합니다.[9]

rm 명령은 IBM i 운영 시스템에도 이식되었습니다.[10]

Syntax

rm은 옵션이 추가된 후 지정된 파일을 삭제합니다. 사용자는 삭제할 파일을 지정하기 위해 전체 경로 또는 상대 파일 경로를 사용할 수 있습니다. rm은 기본값으로 디렉토리를 삭제하지 않습니다.[11] rm foo는 사용자가 현재 있는 디렉토리에서 "foo" 파일을 삭제합니다.

rm은, 다른 명령과 마찬가지로, 그것이 작동할 방법을 지정하기 위해 옵션을 사용합니다:

  • -r, "재귀적," 디렉토리를 제거하고, 내용을 미리 재귀적으로 제거합니다 (상주할 디렉토리없이 파일을 남겨두지 않도록).
  • -i, "대화형" 모든 각 삭제를 확인하도록 요청합니다.
  • -f, "강제," 존재하지 않는 파일을 무시하고 임의의 확인 프롬프트를 덮어쓰지만 (-i를 효과적으로 취소), 디렉터리가 쓰기-방지되면 디렉터리에서 파일을 제거하지는 않을 것입니다.
  • -v, "장황한," rm이 행하는 것을 터미널에 인쇄합니다.
  • -d, "디렉토리," 빈 디렉토리를 삭제하고 지정된 디렉토리가 비어 있으면 오직 작동합니다.
  • --one-file-system, 오직 인수와 같은 파일 시스템에 있는 파일을 제거하고, 마운트된 파일 시스템을 무시할 것입니다.

rm은 실수로 파일을 삭제하는 것을 방지하기 위해 "rm -i"의 별칭 (C 쉘 별칭, Bourne 쉘 또는 Bash) 기능에 의해 덮어쓸 수 있습니다. 만약 사용자가 확인없이 여전히 많은 수의 파일을 삭제하기를 원하면, 그것들은 -f 옵션을 추가함으로써 -i 인수를 수동으로 취소할 수 있습니다 (나중에 확장된 명령줄 "rm -i -f"에 지정된 옵션이 우선하므로). 불행히도 이 접근 방식은 와일드카드 사용에 대한 위험한 습관을 생성하ㅣ며, 자체 버전의 우발적 제거로 이어집니다.

rm -rf (다양한, rm -rf /, rm -rf *, 및 다른 것들)는 유닉스 재해에 대한 농담과 일화에서 자주 사용됩니다.[12] 명령의 rm -rf / 변형은, 수퍼유저에 의해 실행하면, 현재 파일 시스템에서 접근할 수 있는 모든 각 파일을 시스템에서 삭제되는 원인이 됩니다.

rm은 종종 삭제할 파일 목록을 제공하기 위해 xargs와 함께 사용됩니다:

 xargs rm < filelist

또는, 현재 디렉토리 아래의 모든 디렉토리에서 모든 PNG 이미지를 제거하려면:

 find . -name '*.png' -exec rm {} +

Permissions

보통, 대부분의 파일시스템에서, 파일을 삭제하려면 부모 디렉터리에 쓰기 권한이 필요합니다 (그리고 처음 위치에 있는 디렉터리에 들어가기 위해 실행 권한도 필요합니다). (초보자에게는 혼란스러울 수 있지만, 파일 자체에 대한 허가권은 관련이 없음을 주목하십시오. 어쨌든, GNU rm-f 옵션을 사용하지 않은 한 쓰기-금지된 파일을 삭제할 것인지 확인을 요청합니다.)[13]

디렉토리를 삭제하려면 (rm -r와 함께), 우리는 모든 내용을 재귀적으로 삭제해야 합니다. 이것은 우리가 (비어 있지 않으면) 해당 디렉토리와 (비어 있으면) 재귀적으로 비어 있지 않은 모든 하위디렉토리에 대한 읽기와 쓰기와 실행 권한이 있어야 함을 요구합니다. 읽기 권한은 디렉토리의 내용을 삭제하려면 해당 내용을 나열하기 위해 요구됩니다. 이것은 때때로 그것에 대한 쓰기 권한이 없고 따라서 그것의 내용을 삭제할 수 없기 때문에 비어 있지 않은 디렉토리를 삭제할 수 없는 이상한 상황으로 이어집니다; 그러나 같은 디렉토리가 비어 있으면, 우리는 그것을 삭제할 수 있습니다.[14]

만약 파일이 스티키 비트 설정을 갖는 디렉토리에 존재하면, 파일을 삭제하려면 파일의 소유자여야 함을 요구합니다.

Protection of the filesystem root

썬 마이크로시스템즈는 2005년에 처음 릴리스된 솔라리스 10에 "rm -rf /" 보호 기능을 도입했습니다. 명령을 실행하면, 시스템에서 이제 /의 제거가 허용되지 않는다고 보고합니다.[15] 얼마 후, 같은 기능성은 rm 유틸리티의 FreeBSD 버전에 도입되었습니다.[16] GNU rm--preserve-root 옵션이 주어지면 rm -rf / 실행을 거부하며,[17] 이것은 GNU Core Utilities 버전 6.4가 2006년에 릴리스된 이후 기본값입니다. 최신 시스템에서, 이 안전-장치가 심지어 옵션없이 항상 활성화되어 있습니다. 명령을 실행하려면, 사용자가 수퍼유저이더라도, --no-preserve-root 옵션을 추가함으로써 안전-장치를 우회해야 합니다.

User-proofing

시스템 관리자, 설계자, 및 심지어 사용자도 종종 다음과 같은 줄에 따라 별칭 또는 기능을 생성함으로써 실수로 파일을 삭제하지 못하도록 자신을 방어하려고 시도합니다:

alias rm="rm -i"
rm () { /bin/rm -i "$@" ; }

시스템 관리자, 설계자, 심지어 사용자도 종종 다음과 같은 라인에 따라 별칭이나 기능을 만들어 실수로 파일을 삭제하지 못하도록 자신을 방어하려고 시도합니다.

이것은 rm이 사용자에게 Y 또는 N 키를 눌러 삭제할 것인지 여부를 파일별로 확인하도록 요청하는 결과를 초래합니다. 불행히도, 이것은 사용자가 rm 명령에 전달하는 와일드카드에 대해 부주의하게 만드는 경향이 있을 뿐만 아니라 유지해야 하는 하나의 파일을 지나갈 때까지 y와 리턴 키를 번갈아 가며 눌러서 제거를 확인하는 경향을 조장합니다.[citation needed] 사용자는 심지어 각 파일에 대해 자동으로 "y"를 삽입하는 "yes | rm files"까지 가는 것을 볼 것입니다.[citation needed]

사용자가 한 번만 확인할 수 있도록 하고 적절한 와일드카드를 권장하며 목록을 더 쉽게 확인할 수 있도록 하는 절충안은 다음과 같이 달성할 수 있습니다:

if [ -n "$PS1" ] ; then
  rm () 
  { 
      ls -FCsd "$@"
      echo 'remove[ny]? ' | tr -d '\012' ; read
      if [ "_$REPLY" = "_y" ]; then
          /bin/rm -rf "$@"
      else
          echo '(cancelled)'
      fi
  }
fi

이 기능은 검색 경로에서 시스템 rm보다 먼저 발견될 위험이 있는 쉘 스크립트로 만들어서는 안 되며, 배치 작업을 중단할 수 있는 비-대화형 쉘에서 허용되어서도 안 된다는 점에 유의하는 것이 중요합니다. if [ -n "$PS1" ] ; then ....  ; fi 구조에서 정의를 포함하면 후자로부터 보호됩니다.

"safe-rm"[18] 또는 "trash"와 같은 중요한 파일의 우발적인 삭제를 방지하는 타사 대안이 있습니다.[19]

Maximum command line argument limitation

여러 리눅스 배포판에서 사용되는 GNU Core Utilities 구현은 2007년 10월 9일에 릴리스된 커널 2.6.23 이전에는 include/linux/binfmts.h 파일의 변수 MAX_ARG_PAGES에서 커널 컴파일 시간에 정의되었지만 새로운 커널은 최대 인수 길이를 최대 스택 제한의 25%로 제한하는 명령줄 인수에 대해 커널 내에서 할당되는 페이지 숫자를 명령줄 인수 바이트로 제한합니다.[20] [21] 오류: /bin/rm: Argument list too long.는 명령줄 인수 제한이 초과되면 프롬프트에 표시됩니다.[22]

See also

References

  1. ^ "EFI Shells and Scripting". Intel. Retrieved 2013-09-25.
  2. ^ "rm page from Section 1 of the unix 8th manual". man.cat-v.org.
  3. ^ "RM(1)", FreeBSD-5.4-RELEASE, retrieved February 5, 2015
  4. ^ "RM(1)", NetBSD-2.0, retrieved February 5, 2015
  5. ^ "RM(1)", OpenBSD-3.6, retrieved February 5, 2015
  6. ^ "rm(1): remove files/directories - Linux man page". linux.die.net.
  7. ^ Krzysztof Goj (January 22, 2012). "rm: new option --dir (-d) to remove empty directories". coreutils.git.
  8. ^ McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. 139.
  9. ^ "Shell - KolibriOS wiki". wiki.kolibrios.org.
  10. ^ IBM. "IBM System i Version 7.2 Programming Qshell" (PDF). Retrieved 2020-09-05.
  11. ^ "rm(1) - Linux manual page". man7.org.
  12. ^ Gite, Vivek. "Linux/UNIX: Delete a file". Nixcraft. Retrieved 24 November 2011.
  13. ^ "Linux rm command help and examples". ComputerHope. 24 January 2018. Archived from the original on April 16, 2016. Retrieved 24 January 2019.{{cite news}}: CS1 maint: unfit URL (link)
  14. ^ McElhearn, Kirk (2 January 2014). "Master the command line: Deleting files and folders". Macworld. Retrieved 24 January 2019.
  15. ^ "Meddling in the Affairs of Wizards". Archived from the original on 2016-11-03.
  16. ^ "The previous commit added code to rm(1) to warn about and remove any · freebsd/freebsd@d6b7bd9". GitHub.
  17. ^ "rm invocation (GNU Coreutils)". www.gnu.org.
  18. ^ "Safe-rm in Launchpad". Launchpad.
  19. ^ "andreafrancia/trash-cli". September 12, 2020 – via GitHub.
  20. ^ "Linux_2_6_23 - Linux Kernel Newbies". kernelnewbies.org.
  21. ^ "kernel/git/torvalds/linux.git - Linux kernel source tree". git.kernel.org.
  22. ^ ""Argument list too long": Beyond Arguments and Limitations | Linux Journal". www.linuxjournal.com.

Further reading

External links