“-”에서와 같이 이름이 하이픈 인 것처럼 보이는 Linux에서 파일을 제거하는 방법


33

난 노력 했어

rm -- -
rm "-"
rm "\-"
rm \-

Perl에게 사진 제공

~$ perl -e '$junk = glob("-"); chomp $junk; print "$junk\n"; `rm $junk`;'
-
rm: cannot remove `-': No such file or directory

...과...

~$ perl -e '$junk = glob("-"); chomp $junk; print "$junk\n"; `mv $junk newfile.garbage`;'
-
mv: cannot stat `-': No such file or directory

현명한 사람들이라면 어떤 도움이라도 주시면 감사하겠습니다.


호기심으로 어떻게 거기에 도착 했습니까?
Petey B

2
그것은 제대로 구성 wget과의 결과였다 "wget을 -q -O - someserver.org/s/ip "

53
동료가 *라는 파일을 만든 시간을 상기시킵니다. 이 이야기는 잘 끝나지 않았다.
David Heffernan

() 어떤 rm버전을 사용하고 rm --version있습니까? rm -GNU coreutils 8.5와 잘 작동합니다.
Lekensteyn

2
또 다른 변형 :rm ./-
CVn

답변:


60

유닉스 용 유즈넷 FAQ에 게시되었습니다 . GNU 코어 유틸리티 FAQ에 있습니다. 적어도 다섯 가지 방법이 있었지만 잘 작동합니다.

$ rm ./-

파일 이름에 입력 할 수없는 문자가 포함되어 있으면 다음을 사용하십시오.

$ rm -i *

-i가 제거 여부를해야하는지 플래그는 각 파일에 대한 확인을 요청합니다.


1
또는 대시와 공백이 포함 된 파일을 찾는 경우 rm -i- ' - '
Hans-Peter Störr

1
rm -i *도 나를 위해 일했습니다. wallyk 감사합니다!
jgrundstad

39

이름이 시작하는 파일을 제거하는 -것은 FAQ이지만 다른 문제가있는 것 같습니다.

질문에서 언급 한 솔루션 중 :

rm -- -

작동합니다.

rm "-"

그것과 다르지 않습니다 rm -. 따옴표는 셸로 제거되며 rm명령은 단일 하이픈을 인수로 간주합니다. 인용 부호는 쉘 메타 문자를 이스케이프 처리하는 데 유용합니다. 하이픈은 rm쉘이 아닌에 특수합니다 .

rm "\-"

인용 부호는 백 슬래시를 이스케이프하므로 이름이 백 슬래시와 하이픈으로 구성된 파일을 제거합니다.

rm \-

이것과 rm "-"같습니다 rm -.

적어도 GNU coreutils 버전의 rm경우 rm -실제로는 이름이 하이픈으로 구성된 파일을 실제로 제거하거나 제거하려고 시도합니다. 파일 이름이 같으면 지금 사라질 것입니다. 파일 이름이 하이픈 처럼 보입니다 .

ls | cat -A

그것이 실제로 불려지는 것에 대한 아이디어를 제공해야합니다.

다음은 현재 디렉토리의 각 파일을 묻는 메시지를 표시하고 제거 여부를 묻는 Perl 스크립트입니다. 보증없이 제공되지만 간단히 테스트했습니다.

#!/usr/bin/perl

use strict;
use warnings;

$| = 1;

opendir my $DIR, '.' or die ".: $!\n";
my @files = sort grep { -f $_ } readdir $DIR;
closedir $DIR;

foreach my $file (@files) {
    print "Remove $file? ";
    my $answer = scalar <>;
    if ($answer =~ /^[Yy]/) {
        unlink $file or warn "$file: $!\n";
    }
    elsif ($answer =~ /^[Qq]/) {
        exit 0;
    }
}

편집 : 덜 정교한 해결책 : 파일 이름이 하나의 문자 인 rm ?경우 다른 파일과 함께 파일을 제거해야합니다.


13
M-bM-^@M-^S유니 코드 "EN DASH"문자 (0x2013)의 3 바이트 UTF-8 표현을 나타냅니다. 실수로 웹 페이지에서 복사하여 붙여 넣었는지 궁금합니다.
Keith Thompson

7
rm -i *작동 하지 않았다 ? 펄 스크립트와 같은 일을하는 것 같습니다.
user606723

2
나는 wget을 지적한 웹 페이지에서 나온 것 같아요. 어쨌든 철저한 해결책에 다시 한번 감사드립니다! 돌봐
jgrundstad

5
perl -e 'unlink grep {print "제거 $ _?"; <STDIN> = ~ / y / i} glob "*" '
Randal Schwartz '10

6
@RandalSchwartz : 인상적인 간결한 (그리고 내 뇌가 약간의 상처를 만든다) -하지만 내가 원하는 것 /^y/i보다는 /y/i. 결국 러시아 사용자는 "Nyet"을 입력 할 수 있습니다.
Keith Thompson

19

더 안전한 것을 원한다면 ...

ls 조합을 사용하여 찾아보십시오 (이것은 제거 권한이있는 모든 파일에 적용됩니다)

'-i'매개 변수는 각 디렉토리 항목 ls -li의 inode 번호를 제공합니다.

27 ----------  1 owner  group       3981 Oct 11 04:42 ?????

아이 노드 번호가 있으면 ...

find . -inum **27** -exec rm -i {} \;

2
이 문제에 대한 일반적인 답변이므로 +1입니다. 그런데 최근 찾기에서 -exec rm을 사용할 필요가 없습니다. -delete를 사용하십시오
Sirex

2
@Sirex - 난 지점이 생각 -exec rm -i {}은 IS -i제거에 프롬프트. 보고 있는데 man find그렇게 할 방법이 없습니다.
Stephen P

오 예,이 경우에요 더 많은 팁이었습니다.
Sirex

13

부여 rm ./-시도.

-플래그 인수를 시작하는 플래그입니다. 당신은 아무것도하지만 함께 인수를 시작하면 -,이 경우 /, 그것은 파일 이름입니다 가정합니다. 당신이 원하는 것입니다.

그리고 이후 file./file같은 파일입니다, 그것은라는 이름의 파일 타겟으로 -통해를 ./-.


8
30자를 입력하는 대신 /가 올바르게 구문 분석되는 이유를 설명하는 것이 더 유용했을 것입니다.
Ivo Flipse

@gcb 제안 된 편집에 감사드립니다. 코드 마크 업을 추가 했으므로 쉽게 읽을 수 있습니다.
slhck

7

대부분의 다른 답변만큼 괴짜는 아니지만 mc자정 사령관 의 인스턴스를 시작 하고 파일을 선택하고 삭제하십시오.


GUI 프로그램에 의존하지 않고 문제를 현명하게 회피하는 데 +1.
sleske

7

시험:

$ ls -b

파일 이름에 인쇄 할 수없는 문자가 있는지 확인하십시오.


왜 공감해야합니까? 후속 조치가 주어지면 이것은 매우 좋은 제안처럼 들립니다.
Ilmari Karonen

6

여기에 perl을 사용해야 할 필요는 없지만 작동해야합니다.

perl -e 'unlink "-"'

또는 위의 오류가 무엇인지 확인하십시오.

perl -e 'unlink "-" or die "Err: $!"'

이 방법은 걱정할 특수 문자가 없다는 장점이 있습니다 (문자열 인용 문제 이외).
Kevin Reid

3

그놈의 노틸러스를 사용하여 이름이 잘못된 파일을 제거하는 데 행운이있었습니다. X 서버를 실행하고 있습니까? 다른 파일 브라우저도 작동 할 것이라고 확신합니다.


3

만약

rm -- -

작동하지 않으면 파일 이름은 "하이픈 만"이 아닙니다. 다른 파일에 하이픈이 없으면 시도해 볼 수 있습니다

perl -E'for (@_) { if (/-/) { unlink($_) or die $! } }' -- *

1

지금까지 게시 된 모든 메소드에 대해 "No such file or directory"는 다음과 같습니다.

rm ./-
rm -- -
mv "-" test.txt
rm -rf '-' <-- this gives no error, but doesn't work
perl -e 'unlink "-";'  <--also no error, doesn't work.

rm 버전 7.4가있는 것 같습니다. 이러한 제안을 업그레이드하고 다시 시도해 보겠습니다. 도와 주셔서 감사합니다.


1
그런 파일이나 디렉토리가 없으며 파일 이름에도 보이지 않는 문자가 포함되어 있다고 생각합니다. (그리고 'unlink "-"또는 die "Err : $!"'와 함께 펄에서 같은 오류 메시지가 나타날 수 있습니다). 실제 파일 이름이 무엇인지 보려면 "ls -b"를 시도하십시오.
runrig

1

나는 dired이런 종류의 일을 위해 emacs에서 모드 를 사용하는 것을 매우 좋아 합니다. emacs에서 디렉토리를 "열기"만하면됩니다. 파일을 쉽게 선택하고 삭제 표시 할 수 있습니다.

또 다른 포스터는 자정 사령관의 사용을 제안했습니다. 이것은 거의 같은 생각이지만, 이미 emacs 사용자라면 더 편리 할 것입니다.


0

rm -f '-'cygwin에서 저 를 위해 일할 수 있을까요

그 문제에 rm -대해서도 빨간 모자에서 작동하는 것 같습니다.


우분투에서 ~ / jj $ rm -rf '-'~ / jj $ ls –

rm -나에게도 효과가 있습니다.
uzsolt

1
왜 -r? 필요하지 않은 경우 재귀 삭제를 요청하면 잘못 입력하는 경우 항상 위험합니다.
Hans-Peter Störr

@ hstoerr, 좋은 지적. 단지 habbit. 손이 뇌보다 빠릅니다. 답변을 편집 해 주셔서 감사합니다.
Lucas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.