이름이 "-"(하이픈, 일명 대시 또는 빼기)로 시작하는 파일을 어떻게 삭제합니까?


348

파일 이름이 대시 (하이픈 또는 빼기)로 시작하는 파일을 어떻게 제거 -합니까? 원격 OSX 서버에 ssh'd이고 내 디렉토리에이 파일이 있습니다.

tohru:~ $ ls -l
total 8
-rw-r--r--    1 me  staff  1352 Aug 18 14:33 --help
...

--helpCLI에서 세계를 어떻게 삭제할 수 있습니까? 이 문제는 때때로 다른 형태로 나타나는 문제입니다. 이러한 파일은 작성하기 쉽지만 제거하기는 어렵습니다.

백 슬래시를 사용해 보았습니다.

rm \-\-help

나는 따옴표를 시도했다

rm "--help"

빼기 (대시 또는 하이픈) 문자가 옵션으로 해석되지 않도록하려면 어떻게해야합니까?


1
이 질문의 이름이 "-로 시작하는 파일을 삭제하는 방법"으로 이름이 바뀌면 좋을 것입니다.
Sandy

@ 샌디 동의; 나는 보통 질문의 의미를 바꾸는 것을 싫어하지만,이 경우 받아 들여진 대답은이 문제에만 해당됩니다
Michael Mrozek

33
rm --help실제로로 시작하는 파일 이름을 삭제하는 방법을 설명하는 약간 아이러니합니다 -. 그럼에도 불구하고 좋은 질문입니다.
lesmana

1
@ jw013 때로는 숙련 된 사용자가 이해하기 쉽지만 압도적이며 혼란스러워합니다.
iconoclast 2016 년

1
BusyBox의 rm을 사용하여 시스템 에서이 문제가 발생했습니다. 도움말을 포함하여 모든 것이 최소이므로 rm --help는 단서를 제공하지 않았습니다.
dslake

답변:


497

"-"를 사용하여 다음과 같이 rm 구문 분석 명령 행 옵션을 작성하십시오.

rm -- --help

1
나는 이것이 아주 간단한 것임을 알았습니다 ...
Bryan Rehbein

2
모든 버전의 rm명령이 --인수를 지원 합니까?
Keith Thompson

3
@KeithThompson-대부분의 GNU 도구의 기능이므로 대부분의 비 GNU ( "Linux 이외") Unix (예 : BSD 변형 또는 일부 임베디드 시스템)에서는 작동하지 않습니다.
dtech

1
감사! 그것은 나의 하루를 구했다. 물론 BSD (OSX) 및 다른 명령에서도 작동합니다!
raskhadafi

8
@dtech, getopt () 및 --GNU (SysIII, 1980) 이전이며 표준 / POSIX입니다. (예를 들어 echo) 몇 가지 예외를 제외한 표준 유틸리티는 이해 --합니다. getopt () API를 사용하여 옵션을 구문 분석하지 않는 다른 명령의 경우 YMMV
Stéphane Chazelas 2016 년

213

아니면 할 수 있습니다

rm ./--help

7
중요하지는 않지만 가장 "적절한"것으로 보입니다.
James M.

2
이것은 내가 기억하는 것입니다. "rm---help"를 사용하면 항상 찾아야합니다.
user603

25
이 방법은 --특별히 취급하지 않는 명령에도 항상 작동합니다 .
jw013

그리고 그것은 또한 같은 특별히 명명 된 인수의 (옵션 옆에) 다른 유형의 일부 명령에 의해 특별 대우를 방지하기 위해 노력하고 -텍스트 유틸리티 또는 cdfoo=barawk...
스테판 Chazelas가

1
파일이 단일 대시로 시작될 때 작동합니다 rm -- <filename>.
StockB

37

find그것을하기 위해 사용하십시오 :

find . -name '--help' -delete

그리고 이것은 당신이 삭제할 수있는 이와 같은 몇 개 이상의 파일이있는 -delete경우 먼저 옵션 없이 find를 실행하여 파일의 미리보기 목록을 얻을 수 있고 파일 목록이 좋아 보이는 경우 실행됩니다 와 함께 다시 -delete.

사실, 당신 rmfind(특히 미리보기 를 선호) 선호 하지 않는 rm *것은 언젠가는 당신을 물린 실수를 피하는 데 도움이되는 좋은 습관 입니다.

그러나 find는 모든 서브 디렉토리를 통해 재귀하므로, 다음과 같은 서브 디렉토리 깊이 제한 조건으로이를 실행할 수 있습니다.

find . -maxdepth 1 -name '--help' -delete

현재 디렉토리로 찾기를 제한합니다.


살펴볼 find파일 / 디렉토리 목록 을 제공해야합니다 . 그래서 find . -name.... -delete-maxdepth표준 옵션 중 하나를하지 않습니다.
Stéphane Chazelas 2016 년

21

Vegar Nilsen과 edfuh의 답변은 매우 좋으며 이와 같은 문제에 대한 적절한 해결책입니다.

난 당신이 삭제할 수 있습니다이 질문에 일반적인 응답을 추가하고 싶어 어떤 어려운 파일 이름으로 파일을. 먼저 inode 번호는 ls -i형식 또는 형식을 사용하여 얻은 stat다음 현재 디렉토리에서 inode 번호로 rm파일을 검색하고 일치하는 inode 번호로 파일 에서 명령을 실행 하여 파일을 제거합니다.

find . -inode <inode> -exec rm {}\;

inode 번호는 각 파일 시스템마다 고유하므로이를 사용하여 모든 파일을 제거 할 수 있습니다. 유니 코드 또는 이스케이프 문자 사용 입력하는 것이 매우 성가신 일이므로 줄을 추가하는 것이 좋습니다.

TAB: menu-complete             # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards

.inputrcbash를 사용하는 경우 파일 에 넣으십시오 . 이를 통해 가능한 완료 목록 을 자세히 볼 수 있습니다 ( 자세한 내용은 ).


5
이 방법에는 두 가지 문제점이 있습니다. 1) -delete를 사용할 수있을 때 -exec rm을 사용하지 마십시오. 2) inode를 find -name '--help' -delete
가져 와서

나는 그것이 효과가 있다고 생각하지 않습니다. 현재 디렉토리와 모든 서브 디렉토리의 모든 파일을 순회하며 여전히 호출 하지만 여전히rm --help 파일을 제거하지는 않습니다. 그냥 사용하십시오 rm ./--help(또는 rm -i *.
Keith Thompson

1
@KeithThompson는 find모든 파일에 명령 행 인수 경로를 접두사, 그래서 그것을 실행하는 것 rm ./--help하고 rm ./sub/dirs/--help. 두 번째 문제를 해결하려면을 추가해야 -maxdepth 1하지만이 모든 것은 본질적으로 @edfuh의 솔루션을보다 우회하고 복잡한 방식으로 적용 -delete하고 있으며 -exec rm어쨌든 보다 안전 합니다.
jw013

1
이 명령을 한 가지 더 문제는이 사이에 공간이어야한다는 것입니다 {}\;그렇지 않으면 작동하지 않습니다.
Eugene S

inode 는 고유 할 수 있지만 동일한 inode를 가진 여러 디렉토리 항목이있을 수 있습니다. 이를 하드 링크라고합니다. 또한 파일 시스템마다 고유하므로을 사용해야 -xdev합니다. 그것은 당신이 그것을 실행하는 데 도움이되지 않습니다 ls -i --help.
Stéphane Chazelas 2016 년


8

Linux 대시와 공백이있는 파일을 만든 다음 제거하는 연습.

조심해! 실수로 rm -rf /유사한 캐스케이드 삭제 명령을 실행하지 마십시오 .

제거하려는 파일이 별표 (*) 또는 슬래시가 포함 된 경우, 실수로 펌프하지 않는다 .거나 /*또는 *운영 체제를 삭제 계단식 수 또는 다른 와일드 카드.

"--yo yo"라는 파일을 만듭니다.

eric@dev ~ $ touch -- "--yo yo"
eric@dev ~ $ ls
bin  --yo yo

먼저 찾기로 찾으십시오.

eric@dev ~ $ find . -name "*--yo yo*"
./--yo yo

find 명령 만 삭제하려는 하나의 파일 만 찾습니다.

그런 다음 -delete 옵션을 전달하여 찾으십시오.

eric@dev ~ $ find . -name "*--yo yo*" -delete
eric@dev ~ $ ls
bin  

Aaaannd 사라졌습니다.


2

자정 사령관 ( mc)이 가장 쉬운 방법입니다. 겨냥하고 F8을 누르십시오.)


3
OP는 명령 줄 (CLI) 솔루션을 원합니다.
Francesco Turco

1
자정 사령관은 CLI 솔루션입니다. 패키지 관리자를 사용하여 설치하십시오. (ssh에서도 작동합니다 ...) en.wikipedia.org/wiki/Midnight_Commander
daviewales

6
어떻게 apt-get install mc || yum install mc; mc 다양한 화살표 키와 F8 더 쉽게 rm ./--help?
Josh

3
@daviewales : Midnight Commander는 명령 줄에서 시작 되어 터미널에서 실행 되지만 Midnight Commander 내의 모든 키보드 동작은 CLI (명령 줄 인터페이스)에서 온 것이 아니라 Midnight Commander의 인터페이스에서 온 것입니다. -일반적으로 명령 줄 유틸리티는 스크립트 내에서 실행할 수 있습니다 (예외는 bash 명령 줄 기록입니다)
Peter.O

1

이 스레드를 찾기 전에 사용한 솔루션이 있습니다. 디렉토리를 '편집'
하는 vim데 사용하십시오 .

vim .

그런 다음 (vim에서) 파일을 선택하고 del을 누르고 삭제를 확인하십시오.
당신이 끝나면 vim을 종료:q


0

디렉토리 이름을 접두어로 추가하려고 했습니까?

$ rm ./-filename.txt dirname/-filename2.txt
$ mv ./-filename.txt filename.txt
$ cp teste ./-teste

일반적으로 디렉토리를 파일의 접두사로 사용하면 구문 분석기 기능에서 "빼기"문자를 명령 옵션으로 잘못 해석하지 않아도됩니다.


1
나는 이것이 이미 이전 답변에서 다뤄 졌다고 생각합니다 .
Kusalananda

-3

파일 이름을 바꾸려면 -.bar , (mv는 작동하지 않습니다) 다음을 시도하십시오.

cat >foo.bar <-.bar

명령을 사용하기 전에 :

rm -- -.bar

foo.bar에서 원본 파일의 내용을 검사 할 수 있어야합니다.


4
파일 사본을 만드는 것이 파일 이름을 바꾸는 데 매우 효율적인 솔루션은 아닙니다.
jw013

1
vidir을 사용할 수 있습니다. 그러나 그것은 아마도 비효율적이며 훨씬 더 위험합니다.
Stephen Menasian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.