라는 디렉터리를 삭제하려고 합니다 --crm
. 내가 할 때
rm -f -R '--crm'
다음 오류가 발생합니다.
rm: illegal option -- -
usage: rm [-f | -i] [-dPRrvW] file ...
unlink file
나도 시도했다
rm -f -R *crm
그러나 디렉토리는 삭제되지 않습니다.
내가 무엇을 해야 할지에 대한 단서가 있나요?
답변1
솔직히 말해서 이것은 Unix & Linux, Ask Different 또는 SuperUser 등 다른 .SE 중 하나에 더 적합할 것입니다. 그래서 나는 당신이 반대표를 받았다고 생각합니다. 그 의미는...
짧은 답변
대답은 rm -r ./--crm
, 또는 더 나은 것은 입니다 rmdir ./--crm
.
진짜 대답
OS에서는.
함께 man rm
며칠 동안 man bash
이러한 개념 중 일부를 읽고 배우십시오.
또한 대부분의 Unix 명령줄 프로그램은 명령 뒤에 오는 특정 매개변수를 사용하여 실행됩니다. 일부는 명백하며 프로그램에 데이터를 전달하여 작동합니다. 예를 들어 를 실행하면 rm myfile
커널을 호출하여 파일에 대한 연결 해제기를 실행할 수 있습니다 myfile
. 다른 매개변수는 특정 옵션을 켜거나 끄는 스위치 세트처럼 작동합니다. 이는 프로그램 자체의 동작을 제어하기 위해 데이터를 전달하는 대신 "플래그"라고도 합니다. 예를 들어 rm -h
아무것도 삭제되지 않지만 유용한 텍스트의 작은 부분이 인쇄됩니다.
따라서 특이한 이름을 가진 파일을 삭제할 때의 문제는 프로그램이 이를 해석하는 방법을 모른다는 것입니다. 문자를 던지는 것도 도움이 되지 않으며 문제가 발생할 수 있습니다.
Bash 사용: 작동하지 않는 이유
Bash(쉘)는 작은 따옴표 안의 내용을 문자 그대로 해석하고 따옴표를 제거하고 내용을 있는 그대로 가져옵니다. 따라서 을 실행하면 rm '--crm'
실제로 와 동일한 작업을 실행하게 됩니다 rm --crm
. Bash는 *
이를 독점적으로 특수 문자로 취급하여 "와일드카드" 작업을 수행합니다. 호출한 프로그램을 실행하기 전에 Bash지정한 각 일치하는 경로 이름으로 매개변수를 확장합니다.. 실제로 디렉터리에
~$ ls
--crm dummy.txt file.crm
그런 다음 를 실행하면 rm *crm
Bash가 먼저 이를 확장한 다음 확장된 버전을 실행합니다.
~$ rm --crm file.crm
...따라서 "crm"으로 끝나는 모든 파일이 삭제될 위험이 있으며 첫 번째 디렉터리를 다시 플래그로 해석합니다.
Bash 사용: 작동 방식
디렉터리를 삭제할 파일로 처리하려면 Bash가 알아야 하며, 알아야 할 모든 것은 rm
항상 명시적이고 정규화된 경로 이름이 필요합니다. 위와 같은 대부분의 일반적인 파일에 대해 myfile
Bash는 일반적으로 현재 작업 디렉터리를 참조하고 있다는 것을 알 만큼 똑똑합니다 cd
. 이 문제를 관리하는 데 도움이 되는 두 가지 특별한 역할이 있습니다. cd ..
예를 들어, 현재 디렉토리 "위" 디렉토리로 이동합니다. /Users/foobar에 있는 상태에서 를 실행하면 cd ..
/Users로 이동하게 됩니다. 마찬가지로 현재 디렉터리를 나타내는 문자, 즉 가 있습니다 .
. 실행하면 cd .
이미 있는 디렉토리로 이동합니다. 별로 좋아 보이지 않죠?
하지만 이는 불행하게도 이름이 지정된 디렉터리가 어디에 있는지 Bash에게 알려주는 방법을 제공합니다. .
파일이 현재 디렉터리에 있으므로 --crm
이를 지정하고 삭제할 수 있습니다 rm ./--crm
. 음, 구체적으로 이것은 디렉터리이므로 rm
알려야감소그리고재귀디렉토리를 찾아보고 거기에서 찾은 모든 것을 먼저 삭제하십시오. 플래그를 사용하여 이를 수행 할 수 있습니다 -r
. 따라서 rm -r ./--crm
.
마지막 경고: 이제 모든 내용을 설명했으므로 달리기의 심각한 위험도 이해하시기 바랍니다 rm -r -f /
. -f
자신이 무엇을 하고 있는지 알지 못한다면 이 플래그를 절대 사용해서는 안 됩니다.