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

오타를 만들었습니다.

$ 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 :-/를 입력 할 수 없습니다.이 파일을 어떻게 제거합니까?



답변

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

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


답변

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, 인수 순서 문제 !


답변

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

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


답변

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

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

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

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

rmdir "$(printf '\x03')"

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


답변

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

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

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

ls -ld ?

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

rmdir ?

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

rmdir ?

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

rmdir ^C/

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


답변

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

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


답변

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

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

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

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

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

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