Ir para o diretório com nome desconhecido


8

Ao descompactar um tarball, encontrei um diretório que lsinforma como "??????????????????". Presumivelmente, o nome não está no unicode? De qualquer forma, não consigo encontrar 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?


Talvez seja lexicamente o primeiro na lista de diretórios? Então cd */pode funcionar. *deve expandir uma descrição compreensível do diretório e cdignora argumentos extras. Outra maneira pode ser usar um gerenciador de arquivos gráfico (incluindo o MC baseado em terminal) ou os navegadores de árvore de arquivos embutidos no Vim, por exemplo. Você também pode experimentar a -execmudança para o find, not with cd` diretamente (que é um shell embutido), mas com, por exemplo, lse outras ferramentas.
Daniel Andersson

@ Daniel: Em algumas conchas, cdcom vários argumentos falha.
Scott Scott

@ Scott: Verdade. O POSIX não especifica o comportamento de vários argumentos. Bash e Dash ignoram argumentos extras, o csh sai com " too many arguments".
Daniel Andersson

Respostas:


3

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 obter valores de inode
  • -a para visualizar todos os arquivos, mesmo arquivos ocultos (opcional)

Na lista, você verá um número longo na primeira coluna, algo como isto:

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 lista de diretórios.

Claro que o comando não precisa ser cd. Poderia ser rm, cp, mv, etc ...


2

Como os caracteres são prováveis ​​caracteres internacionais, eles provavelmente estão aparecendo como códigos de controle no 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 alias '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

O que imprimirá algo como o seguinte:

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

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

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

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

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 em branco adicional oculto que possa estar no final (observe os espaços extras no final no exemplo)

Depois de saber quais caracteres de controle estão em jogo e se há espaço em branco oculto adicional, você poderá encontrar uma maneira de fazer o cd no 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, convenientemente, possui um método rápido e sujo para remover os caracteres de controle por meio do comando mv, que acho que funcionará, desde que você escape do espaço, mas NÃO escape dos pontos de interrogação (tornando-os um caractere único) curingas) e desde que não exista mais nada no diretório em que este diretório não autorizado esteja. O motivo desses requisitos explícitos é porque você está usando apenas caracteres curinga e espaço único e, portanto, não deseja que o curinga corresponda inadvertidamente a qualquer outro arquivo ou diretório.

Se o método acima não funcionar, você poderá quase certamente usar o método find mencionado por outras respostas, de uma maneira diferente. Em vez de tentar cd para o diretório usando o número do inode, que foi o que você disse que tentou, você pode renomeá-lo usando o número do inode. Apenas certifique-se de copiar o conjunto inteiro de 3 linhas para esse comando da página acima (substitua a parte "nome desejado" pelo nome real no qual você deseja renomeá-lo).

Depois que o diretório for renomeado, você poderá acessá-lo. Só espero 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 você acabou de renomear, no ponto em que um loop for provavelmente será prudente nomear todos os arquivos como um número, incrementando de 1. :-)


0

"?" tem um significado especial no shell, significa "qualquer caractere, incluindo nenhum". Portanto, se o seu arquivo tiver mesmo o nome "??????????????? ?????" você provavelmente tem que escapar do "?" (e espaços também) para que você possa tentar algo como cd \? \? \? \? \? \? \ \? \? \? \? (se você ainda não tentou)

Isso pressupõe que alguém intencionalmente deu ao arquivo esse nome complicado, em vez da codificação ilegível / corrompida / ilegal.


11
Mas lembre-se de que lsgosta de exibir caracteres não ASCII (≥0x7F) como ?–– portanto, o nome do diretório provavelmente não é apenas uma sequência de pontos de interrogação.
Scott Scott

0

Faça um ls. Existe algo no diretório (arquivo ou subdiretório) com um nome mais longo que o subdiretório misterioso (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 ????????????????????*

Esse curinga (20 pontos de interrogação seguidos por um asterisco) deve corresponder a qualquer nome com 20 caracteres ou mais - e a primeira instrução que forneça deve ter assegurado que seu subdiretório misterioso seja a única coisa que corresponde a esse padrão. Mas pode ser mais útil fazer

mv ????????????????????* novo nome


3
Pode ser útil executar lscom a opção --quoting-style=shellou ou --quoting-style=escapepara forçá-lo a produzir uma versão com escape adequado desse nome de arquivo.
Dan D.

11
@DanD. +1 para a opção legal que eu não conhecia. Normalmente, uso apenas um gerenciador de arquivos da GUI quando algo assim precisa ser resolvido, mas pode ser útil se eu tiver que trabalhar em um console ou em um script.
Joe

0

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


0

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


0

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

1) Execute ls -ipara descobrir o inode do arquivo.

Esta lsopção fornece cada nome de arquivo e um identificador para esse arquivo no sistema de arquivos (o inode)

2) Use find para executar um comando no arquivo

digamos que o inode era 9961926

você poderia correr

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

excluir o arquivo

ou

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

para movê-lo para um nome melhor

ou mesmo

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

para dar um novo nome, mantendo o nome antigo

(presumivelmente, você também pode executar outros comandos. Infelizmente, não foi possível usar esta linha para executar a cd)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.