알 수없는 이름으로 디렉토리로 이동


8

tarball의 압축을 풀 때 ls"??????????????? ?????"로보고 되는 디렉토리가 발견 되었습니다. 아마도 이름이 유니 코드가 아닌 것 같습니다. 어쨌든 폴더에 액세스하는 방법을 알 수 없습니다. 나는 시도 cd $(find -inum inode_number)했지만 그게 나에게 준다.

"bash: cd: ./??????????: No such file or directory".

inode 번호로 폴더에 직접 액세스하는 다른 방법이 있습니까?


디렉토리 목록에서 어휘 적으로 첫 번째입니까? 그렇다면 효과 cd */가있을 수 있습니다. *쉘이 이해할 수있는 디렉토리 설명을 확장해야하며 cd추가 인수는 무시합니다. 다른 방법은 그래픽 파일 관리자 (터미널 기반 MC 포함) 또는 내장 파일 트리 탐색기 (예 : Vim)를 사용하는 것입니다. 또한 실험 할 수 -exec로 전환 find, not with 하지만 예와 (내장 쉘입니다) 직접 cd` ls및 기타 도구.
Daniel Andersson

@Daniel : 일부 셸에서 cd여러 인수를 사용하면 실패합니다.
Scott

@Scott : 맞습니다. POSIX는 여러 인수의 동작을 지정하지 않습니다. Bash와 Dash는 추가 인수를 무시하고 csh는 " too many arguments"로 종료 합니다.
Daniel Andersson

답변:


3

모든 디렉토리 (또는 파일)에서 작동 할 수있는 일반적인 접근 방법은 inode 번호를 사용하는 것입니다.

먼저 ls를 사용하여 해당 폴더의 inode를 가져옵니다.

ls -lia
  • -l 긴 목록의 경우 (선택 사항)
  • -i 아이 노드 값을 얻기 위해
  • -a 숨겨진 파일을 포함한 모든 파일을 볼 수 있습니다 (선택 사항)

목록에서 첫 번째 열에 긴 숫자가 표시됩니다.

2104697 drwx------ 2 user group 4096 date time WEIRD_DIRNAME

이제 다음을 사용하여 해당 디렉토리로 변경할 수 있습니다.

cd "$(find -inum ######)"

...하지만 디렉토리 목록에있는 긴 숫자로 ######을 대체하십시오.

물론이 명령은 필요하지 않습니다 cd. 그것은 수 rm, cp, mv, ...


2

문자는 다국어 문자 일 수 있으므로 en_US 문자 세트에서 제어 코드로 표시 될 가능성이 높으므로 ls가 물음표로 표시합니다.

이는 전역 프로파일에서 기본적으로 분배에서 별명 l을 선택했기 때문일 수 있습니다. 예를 들면 다음과 같습니다.

alias ls='ls -q'

쉘에 입력하면 배포판이 그렇게되었는지 확인할 수 있습니다.

alias ls

다음과 같은 내용이 인쇄됩니다.

$ alias ls
alias ls='ls --color=auto'

아래 링크 된 페이지는 "ls -b"를 수행하면 8 진 제어 코드가 표시되어 적어도 어떤 문자가 사용되고 있는지 알 수 있습니다.

http://www.arsc.edu/arsc/support/howtos/nonprintingchars/

그것이 효과가 없다고 가정하면 다른 옵션이 바닥에 더 가깝다고 언급했습니다.

지금까지 몰랐던 도구 인 OctalDump (Debian-/ usr / bin / od)

$ ls | od -b

제어 코드의 8 진 형식을 보여줍니다.

$ ls | od -c

끝에있을 수있는 숨겨진 추가 공백을 포함하여 문자를 표시합니다 (예에서 끝에 공백이 있음에 유의하십시오)

어떤 제어 문자가 사용 중인지와 추가 숨겨진 공백이 있는지 알면 제어 문자를 이스케이프 처리하여 디렉토리로 cd하는 방법을 찾을 수 있습니다. 실패하면 디렉토리 이름을 바꾸는 몇 가지 옵션이 있습니다.

위의 페이지에는 편리하게도 mv 명령을 통해 제어 문자를 제거하는 빠르고 더러운 방법이 있습니다.이 명령은 공백을 피하고 DONT는 물음표를 피합니다 (따라서 단일 문자로 만듭니다) 이 불량 디렉토리가있는 디렉토리에 다른 것이 존재하지 않는 한. 이러한 명시 적 요구 사항의 이유는 와일드 카드 문자와 단일 공백 ​​만 사용하기 때문에 와일드 카드가 다른 파일이나 디렉토리와 실수로 일치하지 않기 때문입니다.

위의 방법으로 문제가 해결되지 않으면 다른 방법으로 언급 한 찾기 방법을 다른 방식으로 사용할 수 있습니다. 시도한 inode 번호를 사용하여 디렉토리로 cd하려고 시도하는 대신 inode 번호를 사용하여 이름을 바꿀 수 있습니다. 위의 페이지에서 해당 명령 하나에 대해 전체 3 줄 세트를 모두 복사하십시오 (단, 이름을 바꾸려는 실제 이름으로 "원하는 이름"부분을 바꾸십시오).

디렉토리 이름이 변경되면 디렉토리에 액세스 할 수 있어야합니다. 이름에 제어 코드가있는 파일도 포함하지 않기를 바랄 수도 있고 방금 이름을 바꾼 디렉토리의 모든 파일 (및 / 또는 하위 디렉토리)에 대해 헹구고 반복해야합니다.이 시점에서 for 루프는 아마도 1에서 증가하여 모든 파일의 이름을 숫자로 지정하는 것이 좋습니다. :-)


0

"?" 쉘에 특별한 의미가 있습니다. "없음을 포함한 모든 문자"를 의미합니다. 파일 이름이 "??????????????? ?????"인 경우 당신은 아마 "?"를 탈출해야 (그리고 공백도) cd \? \? \? \? \? \? \ \? \? \? \? (아직 시도하지 않은 경우)

누군가가 의도적으로 파일을 그 까다로운 / 부패한 / 불법적 인 인코딩이라하는 까다로운 이름을 부여했다고 가정합니다.


1
그러나 ASCII가 아닌 문자 (≥0x7F)를 –– ls표시 하는 것을 좋아 ?하므로 디렉토리 이름은 단순한 물음표 문자열이 아닙니다.
Scott

0

를 수행합니다 ls. 디렉토리 (파일 또는 서브 디렉토리)에 미스터리 서브 디렉토리 ( "???????????????????"가 21 인 경우 21보다 긴 이름을 가진 이름이있는 디렉토리가 있습니까? 정확한)? 그런 다음 이름을 더 짧은 이름으로 바꾸거나 다른 디렉토리로 이동하십시오. 그런 다음 입력

cd ????????????????????*

이 와일드 카드 (20 개의 물음표와 별표)는 길이가 20 자 이상인 이름과 일치해야합니다. – 첫 번째 지시 사항은 미스터리 서브 디렉토리가 해당 패턴과 일치하는 유일한 항목인지 확인해야합니다. 하지만 더 유용 할 수 있습니다

mv ????????????????????* new_name


3
해당 파일 이름의 이스케이프 버전을 강제로 생성하도록하려면 또는 옵션 ls중 하나 를 사용하여 실행 하는 것이 도움이 될 수 있습니다 . --quoting-style=shell--quoting-style=escape
Dan D.

1
@DanD. 내가 알지 못하는 멋진 옵션은 +1입니다. 나는 보통 이와 같은 것을 처리해야 할 때 GUI 파일 관리자를 사용하지만 콘솔이나 스크립트 내에서 작업 해야하는 경우 유용 할 수 있습니다.
Joe

0

FileZilla를 사용하여 시스템에 FTP를 보내는 것이 쉬운 방법 중 하나입니다. 그런 다음 FileZilla를 사용하여 디렉토리 이름을 바꿀 수 있습니다.


0

Midnight Commander (텍스트), Nautilus (GNOME) 또는 Dolphin (KDE)과 같은 파일 브라우저를 사용하여 디렉토리로 작업하십시오.


0

이름을 입력하기가 이상하거나 어려운 디렉토리 (또는 파일)로 작업하려면 :

1) ls -i파일의 inode를 발견하기 위해 실행 합니다.

ls옵션은 파일 시스템의 각 파일 이름과이 파일의 식별자 (아이 노드)를 제공합니다.

2) find를 사용하여 파일에서 명령을 실행하십시오.

아이 노드는 9961926이라고 말하십시오.

당신은 실행할 수 있습니다

 find * -prune -inum 9961926 -exec rm -i {} \;

파일을 삭제하려면

또는

 find * -prune -inum 9961926 -exec mv {} other-name \;

더 나은 이름으로 옮기다

또는

 find * -prune -inum 9961926 -exec ln -s {} non-horrible-name \;

이전 이름을 유지하면서 새로운 이름을 부여

(아마도 다른 명령을 실행할 수도 있습니다. 불행히도이 줄을 사용하여을 실행할 수는 없었습니다 cd)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.