Ir para o diretório com nome desconhecido

8

Enquanto descompactava uma tarball, encontrei um diretório que ls relata como "??????????????? ?????". Presumivelmente, o nome não está em unicode? De qualquer forma, não consigo descobrir uma maneira de acessar a pasta. Eu tentei cd $(find -inum inode_number) , mas isso me dá

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

Existe outra maneira de acessar uma pasta diretamente pelo seu número de inode?

    
por jackd243 12.01.2013 / 09:12

7 respostas

2

Uma abordagem geral para poder operar em qualquer diretório (ou arquivo) é usar seu número de inode.

Primeiro, use ls para obter o inode da pasta em questão:

ls -lia
  • -l para listagem longa (opcional)
  • -i para obter valores de inode
  • -a para visualizar todos os arquivos, mesmo arquivos ocultos (opcional)

Na listagem, você verá um número longo na primeira coluna, algo assim:

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

Agora você pode mudar para esse diretório usando:

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

... mas substituindo ###### pelo número longo que você obteve na listagem do diretório.

É claro que o comando não precisa ser cd . Pode ser rm , cp , mv , etc ...

    
por 17.01.2013 / 20:09
2

Como os caracteres são provavelmente internacionais, eles provavelmente estão aparecendo como códigos de controle em seu conjunto de caracteres en_US, e é por isso que ls os está mostrando como pontos de interrogação.

Isso pode ser devido à escolha da sua distribuição de apelido ls por padrão no perfil global. Por exemplo:

alias ls='ls -q'

Você pode ver se sua distribuição fez isso digitando no seu shell:

alias ls

Que imprimirá algo como o seguinte:

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

A página abaixo sugere que, se você fizer "ls -b", verá os códigos octal de controle para saber, pelo menos, quais caracteres estão em uso.

link

Supondo que isso não funcione, você tem outra opção também mencionada mais perto do fim:

Uma ferramenta que eu desconhecia até agora chamada OctalDump (no Debian - / usr / bin / od)

$ ls | od -b

Mostrará a forma octal dos códigos de controle.

$ ls | od -c

Mostrará os caracteres, incluindo qualquer espaço adicional oculto que possa estar no final (observe os espaços extras no final em seu exemplo)

Depois que você souber quais caracteres de controle estão em jogo e se há espaços em branco adicionais ocultos, poderá conseguir abrir caminho para o cd para o diretório, escapando dos caracteres de controle. Caso contrário, você tem algumas opções para renomear o diretório.

A página acima também possui, convenientemente, um método rápido e sujo para remover os caracteres de controle através do comando mv, o qual acho que funcionará, desde que você escape do espaço, mas NÃO escape dos pontos de interrogação (assim fazendo caracteres curingas de caractere único), e desde que não exista mais nada no diretório em que esse diretório não autorizado está. O motivo desses requisitos explícitos é que você está usando apenas caracteres curinga e o espaço único e, portanto, não deseja que o caractere curinga atinja inadvertidamente qualquer outro arquivo ou diretório.

Se o método acima não funcionar, você pode usar o método de localização mencionado por outras respostas, de maneira diferente. Ao invés de tentar cd para o diretório usando o número de inode, que é o que você disse ter tentado, você pode renomeá-lo usando o número de inode. Apenas certifique-se de copiar todo o conjunto de linhas 3 para aquele comando da página acima (substitua a parte "nome-desejado" pelo nome real que você deseja renomear).

Quando o diretório for renomeado, você poderá acessá-lo. Eu só posso esperar que ele também não contenha arquivos com códigos de controle nos nomes, ou você terá que enxaguar e repetir para cada arquivo (e / ou subdiretório) no diretório que acabou de renomear, ponto em que um loop for provavelmente seja prudente apenas nomear cada arquivo como um número, incrementando de 1.: -)

    
por 28.02.2013 / 00:27
0

"?" tem um significado especial no shell, significa "qualquer caractere, incluindo nenhum". Então, se o seu arquivo for realmente chamado "??????????????? ?????" você provavelmente tem que escapar do "?" (e espaços toos) para que você possa tentar algo como cd \? \? \? \? \? \? \ \? \? \? \? (se você não tentou já)

Isso é suposto que alguém intencionalmente deu ao arquivo um nome complicado, em vez de uma codificação ilegível / corrompida / ilegal.

    
por 12.01.2013 / 23:20
0

Faça um ls . Existe alguma coisa no diretório (arquivo ou subdiretório) com um nome que é maior do que o seu subdiretório de mistério (que é 21, se o seu "??????????????? ?????" é preciso)? Em seguida, renomeie-os para nomes mais curtos ou mova-os para outros diretórios. Então digite

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

Este caractere curinga (20 pontos de interrogação seguido por um asterisco) deve corresponder a qualquer nome com 20 caracteres ou mais - e a primeira instrução que dei deve ter garantido que seu subdiretório mistério seja a única coisa que corresponda a esse padrão. Mas pode ser mais útil fazer

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

    
por 14.01.2013 / 01:48
0

Uma maneira fácil de ver o que está lá é fazer o FTP para a máquina com o FileZilla. Então você pode usar o FileZilla para renomear o diretório.

    
por 14.02.2013 / 20:32
0

Use um navegador de arquivos como o Midnight Commander (texto), o Nautilus (GNOME) ou o Dolphin (KDE) para trabalhar com o diretório.

    
por 14.02.2013 / 21:39
0

para trabalhar com diretórios (ou arquivos) com nomes estranhos / difíceis de digitar:

1) Execute ls -i para descobrir o inode do arquivo.

Esta opção ls dará a você cada nome de arquivo e um identificador para este arquivo no sistema de arquivos (o inode)

2) Use find para executar um comando no arquivo

diga que o inode foi 9961926

você pode correr

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

para excluir o arquivo

ou

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

para movê-lo para um nome melhor

ou até mesmo

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

para dar um novo nome, mantendo o nome antigo

(presumivelmente, você poderia executar outros comandos também. Infelizmente eu não pude usar esta linha para executar um cd )

    
por 27.02.2013 / 16:39