FreeBSD : ^ C (정말!)라는 디렉토리-제거하는 방법?


127

오타를 만들었습니다.

$ history
169 9:34    la /usr/local/etc/
170 9:35    sudo mkdir ^C
171 9:36    sudo mkdir /usr/local/etc/dnsmasq.d

이제 ^ C (ctrl + C)라는 파일이 있습니다 !! 사용 ls하면 물음표가 표시됩니다 (로캘로 인해)?

% ls -al
total 60
drwxr-xr-x  2 root   wheel    512 Jan 21 09:35 ?        <- this one
drwxr-xr-x  5 admin  wheel    512 Jan 21 16:24 .
drwxr-xr-x  3 root   wheel    512 Jan 20 14:29 ..
-rw-r--r--  1 admin  nobody  1114 Jan 20 19:10 .cshrc
-rw-------  1 admin  wheel   6002 Jan 21 15:27 .history
-rw-r--r--  1 admin  nobody   182 Jan 20 14:29 .login
-rw-r--r--  1 admin  nobody    91 Jan 20 14:29 .login_conf
-rw-------  1 admin  nobody   301 Jan 20 14:29 .mail_aliases
-rw-r--r--  1 admin  nobody   271 Jan 20 19:04 .mailrc
-rw-r--r--  1 admin  nobody   726 Jan 20 19:05 .profile
-rw-------  1 admin  nobody   212 Jan 20 14:29 .rhosts
-rw-r--r--  1 admin  nobody   911 Jan 20 19:06 .shrc
drwx------  2 admin  nobody   512 Jan 20 15:05 .ssh
drwxr-xr-x  2 admin  wheel    512 Jan 20 19:08 bin

% ls -i
3611537 ?   3611534 bin

이 파일을 제거하고 싶습니다. 시도 mv하고 탭 완성을 사용할 때 나에게 표시됩니다.

% mv
^C/  bin/

^ C :-/를 입력 할 수 없습니다.이 파일을 어떻게 제거합니까?


11
dsw 가 POSIX로 만들지 않은 것이 너무 나쁩니다 .
Mark Plotnick

12
@MarkPlotnick : 너무 나쁜 원래 POSIX 안으로 들어가지는 못했습니다. dsw
Matteo Italia

4
나는 당신이 그것을 ctrl + C로 명명하지 않았다고 생각합니다. 당신은 아마도 그 키보드 단축키에 매핑 된 ASCII 문자, 즉 ETX (ascii 3)의 이름을 따서 명명했습니다. 콘솔 글꼴에는 해당 문자에 대한 글리프가 없으므로 일반 대체 글리프 "?"를 사용합니다.
jiggunjer

5
emacs -nw -f dired디렉토리 탐색기를 제공합니다. <kbd> D </ kbd>는 확인 후 커서 아래의 파일을 삭제합니다.
Thorbjørn Ravn Andersen

9
@MatteoItalia 파일 이름에 너무 나쁜 제어 문자와 다른 바보 같은 아이디어가 POSIX로 만들었습니다 ...
pipe

답변:


188

^V( ctrl+ v)는 다음 키 누름에 대한 일종의 이스케이프 시퀀스로 작동하여 일반적으로 관련된 작업을 수행하는 대신 관련 값을 삽입합니다.

이것을 사용하면 ^V^C( ctrl+ v, ctrl+ c) 터미널에서 어려운 파일 이름을 입력해야합니다.


41
이것은 아마도 OP가 처음에 오타를 만든 방법 일 것입니다. V와 C는 키보드에서 서로 바로 옆에 있습니다.
Stig Hemmer

14
또는 bsd 터미널에서 Windows 클립 보드를 사용하려고했습니다.
Joel Coel

2
@JoelCoel 습관은 결코 죽지 않습니다!
Mafii

1
흥미롭게도 Zsh 라인 편집기 에서는 작동 ^V^C하지 않습니다 . 인용 - 삽입 위젯 (의 페이지를 검색 ^V) 명시 적으로 인터럽트 문자를 삽입하지 않습니다. Jakob의 답변 (printf 사용)은 쉘 인수로 제어 문자를 제공하는보다 이식성이 좋은 방법 일 수 있습니다.
Miles

@ StigHemmer : 명령 중간에 Ctrl-C를 누른 다음 잊어 버리고 나중에 명령을 복사하여 붙여 넣으십시오.
Mehrdad

89

inode로 파일을 제거 할 수도 있습니다.

$ ls -i1
290742 foo
293246 ^C
$ find . -inum 293246 -delete

무슨 일이 있어도, 하나님을 위하여, 넣지 마십시오 -delete전에 -inum:

$ touch foo bar baz quux
$ find . -name '*u*' -delete
$ ls
bar baz foo
$ find . -delete -name 'b*'
find: `./baz': No such file or directory
find: `./bar': No such file or directory
$ ls
$ 

축하 합니다. 모든 파일 을 지 웠습니다 . find, 인수 순서 문제 !


2
왜 넣지 -delete전에 -inum? Enter 키를 너무 일찍 누르거나 인수 순서가 실제로 결과에 영향을 미치는 경우에 대비 한 예방 조치입니까?
detuur

10
@detuur : 순서가 결과에 영향을 미칩니다. 편집을 참조하십시오.
감독

37
원하는 것을 찾는 지 확인 -delete하지 않고 명령을 실행할 때까지 기간을 명령에 넣지 마십시오 -delete.
Kaz

2
@Kaz는 명령 중심에 -delete를 추가하는 데 큰 도움이되지 않습니다
RiaD

9
@Kaz -print대신에 -delete좋은 테스트를합니다.
Mark Ransom

32

다른 옵션은 rm -ri ./*; rm파일과 디렉토리를 삭제하기 전에 물어볼 것이므로 y"나쁜"파일과 n다른 모든 파일 에 답장 하면됩니다.

실제로, rm -ri ./?"나쁜"파일은 한 문자 길이 이므로을 수행 하여 필요한 답글 수를 줄일 수도 있습니다 .


8
select f in ?; do rm -i "$f"; break; done는 바람직하지 않은 항목을 선도하거나 실수로 원하는 사람에게 예라고 대답하지 -i않아도됩니다 no.
주교

6
OP의 경우 파일이 아닌 디렉토리입니다. rmdir ?/빈 단일 문자 디렉토리를 모두 제거하고 비어 있지 않은 다른 문자에 대해 불평합니다.
Peter Cordes

2
@ 비숍 : 우와, 나는 그것이 select존재 한다는 것을 몰랐습니다 .
Matteo Italia

@PeterCordes : 웁스, 나는 우리가 디렉토리에 대해 이야기하고 있다는 것을 알지 못했다. 불행히도 플래그를 지원하지 않기 때문에 예제에 추가했습니다 -r( ./항상 잊기 쉽습니다) . 그래도이 경우에 가장 좋은 방법은 감독과 귀하의 의견을 조합 한 것이라고 생각합니다. rmdir-i
Matteo Italia

1
@MatteoItalia select는 일부 쉘에만 존재하기 때문에 아마도 쉘을 사용하지 않은 이유 일 것입니다. 이식성이 뛰어난 스크립트와 솔루션은 피할 수 없기 때문에 "실제로"볼 가능성이 적습니다.
mtraceur

23

한 가지 옵션은 파일 이름을 이외의 다른 이름으로 찾아 보는 것 ls입니다. 당신이 그것이 그대로 Ctrl+ 로 생성되었다는 것을 알고 있다면 C, 제어 문자 표를 사용 하거나 Python에서 제공하는 것과 같은보다 친숙한 인터페이스를 사용하여 생성 된 ASCII 문자를 찾을 수 있습니다 :

>>> import os
>>> os.listdir('.')
['\x03', ...]

또 다른 옵션은 ls예를 들어를 사용하여 출력의 16 진 덤프를 보는 것 hexdump입니다.

그런 다음이 bash 명령을 사용하여 파일을 삭제할 수 있습니다.

rmdir "$(printf '\x03')"

(큰 따옴표 만 인쇄하려는 문자가있는 경우 필요한 IFS변수와 같은, \x20또는 \x0A, 그러나 당신이 당신이 쉘 등 필드 분할을 수행 할 모르면 명령 대체를 인용하는 좋은 습관이다)


2
또한 cat -v(plus man ascii)는 첫 번째 부분에 도움이 될 수 있습니다.
Matteo Italia

13
... 또는 os.rmdir('\x03')Python 쉘에서 직접 사용 합니다.
moooeeeep

15

이런 상황에서는 종종 관련 파일과 일치 하는 와일드 카드 패턴 을 쉽게 찾을 수 있습니다.

귀하의 경우 이것은 간단합니다 ?(모든 파일 이름을 정확히 한 문자로 일치시키는 것 ).

원하는 것과 실제로 일치하는지 확인하십시오.

ls -ld ?

그런 다음 디렉토리를 제거하십시오.

rmdir ?

이것을 탭 완성 과 결합 할 수도 있습니다 . 입력 할 수 있습니다

rmdir ?

탭을 누르면 bash에서 다음과 같이 바뀝니다.

rmdir ^C/

Enter 키를 누르면 원하는 작업을 수행합니다.


11

Midnight Commander (mc)를 사용하여 파일을 삭제할 수 있습니다. 위 / 아래 버튼으로 선택하고 F8을 누르십시오.

인코딩으로 인해 파일 이름에 이상한 문자가있는 경우가 종종 있습니다.


4
또는 다른 파일 관리자와 관련이 있습니다.
Stig Hemmer

물론 @StigHemmer, 일부는 특정 파일 이름을 표시하는 데 다른 것보다 낫습니다. 아마도 대답은 왜 몇몇 다른 사람들에 비해 MC가 최적의 선택인지 설명 할 수있을 것입니다. 나는 그것을 사용한 적이 없기 때문에 모르겠다.
can-ned_food

7

또 다른 방법 : stat디렉토리 이름을 이스케이프 처리하는 데 사용 하십시오.

$ stat *|grep File:
  File: ‘\003’

이제 파일 이름의 표현을 알았으므로 다음을 사용하여 이름으로 파일을 제거 할 수 있습니다 printf.

$ rmdir -v "$(printf '\003')"
rmdir: removing directory, ‘\003’

또는 bash를 사용하는 경우 다음을 피할 수 있습니다 printf.

$ rmdir -v $'\003'
rmdir: removing directory, ‘\003’

쉘이 bash 인 경우 BTW는 $'\x03'printf를 호출하는 것보다 간단합니다. POSIX 셸에서 몇 가지 맛있는 기능을 제공하는 FreeBSD sh에서도 마찬가지입니다.
Netch

bash 's에 대한 @Netch의 좋은 지적 $'...'이지만 일반적으로 8 진수에서 16 진수로 쓸모없는 변환을 피합니다. 예를 들어 파일 이름이 '\111'( stat출력) 인 경우 어떻게해야합니까? 계속 사용하여 제거 하시겠습니까 $'\x49'? statOP 와 같은 순서대로 사용하는 것이 좋습니다 rmdir $'\003'.
Ruslan

6

나를 위해 일한 해결책은 다음과 같습니다.

rm ./[Tab][Tab][Tab]...

제거하려는 파일을 찾을 때까지 사용 가능한 파일을 순환합니다.

그러나 셸에 필요한 설정 이 있어야 작동합니다.


^ C는 실제로 탭 시퀀스의 초기 단계이므로 +1입니다.
joshudson

5

가장 쉬운 방법은 모든 것을 임시 디렉토리로 이동 한 다음 rm -r DIRNAME입니다.


7
이 답변이 허용 된 답변보다 더 쉬운 것 같습니까?
병아리

2
@ 병아리 : 실제로 그렇게 나쁜 대답은 아닙니다. ^ V ^ C가 작동하지 않아 누군가가 멈출 수있는 것을 보았습니다.
joshudson

그 자체로는 잘못된 것이 아니지만 더 직접적인 솔루션과 비교할 때 많은 추가 작업처럼 보입니다. 어쩌면 나는 리눅스에 버릇이 있었지만 ^v오랫동안 나에게 일 해왔다.
병아리

6
@chicks ^V는 파일을 이동하는 동안 특정 지식이 필요하며 부모 디렉토리의 제거는 기본 사항에서 파생 될 수 있습니다.
Kondybas

5
Ctrl + V는 정확한 작업 환경에 따라 위험합니다. 일부 터미널 에뮬레이터는이를 페이스트로 해석 할 수 있습니다. 붙여 넣기 버퍼에 삭제하지 않으려는 항목의 이름과 줄 바꿈이 있으면 문제가있는 것일 수 있습니다.
rackandboneman

1

디렉토리가 비어있는 유일한 디렉토리이거나 다른 비어있는 디렉토리를 제거하지 않아도되는 경우을 사용하십시오rmdir */ . rmdir비어 있지 않은 디렉토리를 제거 할 수 없다는 오류 메시지가 표시 되지만 문제는 없습니다. GNU rmdir는 지원 --ignore-fail-on-non-empty하거나 할 수 2>/dev/null있습니다.

후행 /은 glob가 디렉토리 이름과 만 일치하게합니다.

를 사용하여 현재 디렉토리 아래에 비어있는 디렉토리가 있는지 미리 확인할 수 있습니다
find -maxdepth 1 -type d -empty -ls. (그리고 당신은 변경할 수 있습니다 -ls-delete당신이 원하는 경우).

rmdir [^A-Za-z0-9._]/영숫자가 아닌 또는 밑줄 파일 이름으로 시작하는 디렉토리를 일치시키기 위해 보다 구체적인 glob 표현식을 사용할 수 있습니다 . 나도 포함 .했지만 glob 표현은 .정상적으로 일치하지 않습니다 .


다른 사람들이 지적했듯이 glob를 사용하여 단일 문자 이름으로 제한 할 수 있습니다 ?. rmdir ?/

rmdir이없는 -i방법이 옵션을 rm빈 디렉토리는 일반적으로 가치가없는 그냥 다시 할 수 있습니다 아마도 때문에, 수행합니다.


1
어떤 디렉토리를 재생성 할 것인지 알고 싶을 때 (적어도 GNU에서는) 옵션을 rmdir전달할 수 있는지 알 수 있습니다 -v.
Ruslan

@Ruslan : 당신이 더 이상 걱정하지 않는 다른 오래된 디렉토리가 있다면, 그것을 제거하는 것이 보너스가 아닙니다. 당신은 빈 디렉토리를 찾을 수find -maxdepth 1 -type d -empty -ls
피터 코르

-1

위험한 일을하기 전에 먼저 다음을 시도하십시오.

rmdir -- ^C

일반적으로--o ptions를 따르지 않는 명령을 나타내는 구분 기호이지만 이상한 문자가 다른 것으로 해석되지 않을 수도 있습니다.

다른 사용 예는 whois -r -- "-r OBJECT-RIPE"

(-r은 익히기의 지름길이지만 익은 후이의 매개 변수이기도합니다)

처음 시도해도 작동하지 않으면 시도해보십시오. rmdir -- "^C"

그러나 내 csh 쉘에서 나는 그것을 필요로하지 않으며 단순히 rmdir ^C이미 나를 위해 작동합니다.


1
csh 입력 rmdir 에서 <ctrl> C가 작동합니까? 정말?! rmdir명령이 중단되고 명령 줄로 돌아 오는 것처럼 다르게 작동 할 것으로 기대합니다 .
Mausy5043

실제로 것입니다. 명령 행에 ^ C 문자를 입력하는 방법에 대한 승인 된 답변을 참조하십시오.
Ale
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.