Pergunta

Ok, eu tenho trabalhado com Solaris por mais de 10 anos, e nunca vi isso ...

Eu tenho uma listagem de diretório que inclui um arquivo e subdiretório com o mesmo nome:

-rw-r--r--   1 root     other    15922214 Nov 29  2006 msheehan
drwxrwxrwx  12 msheehan sysadmin    2048 Mar 25 15:39 msheehan

Eu uso o arquivo para descobrir conteúdo do arquivo, e eu recebo:

bash-2.03# file msheehan
msheehan:       directory
bash-2.03# file msh*
msheehan:      ascii text
msheehan:       directory

Eu não estou preocupado com o arquivo, mas eu quero manter o diretório, então eu tento rm:

bash-2.03# rm msheehan
rm: msheehan is a directory

Então aqui está a minha pergunta em duas partes:

  1. O que há com isso?
  2. Como faço para excluir cuidadosamente o arquivo?

Jonathan

Edit: Graças para os caras respostas, ambos (até agora) foram úteis, mas canalizando o listando a um editor fez o truque, ala:

bash-2.03# ls -l > jb.txt
bash-2.03# vi jb.txt

que continha:

-rw-r--r--   1 root     other    15922214 Nov 29  2006 msheehab^?n
drwxrwxrwx  12 msheehan sysadmin    2048 Mar 25 15:39 msheehan

Sempre ter cuidado com a tecla de retrocesso!

Foi útil?

Solução

Eu acho que estes são, de facto, dois nomes de arquivos diferentes que "olhar" o mesmo, como o arquivo de comando foi capaz de distingui-los quando o shell passou as versões expandidas do nome. Tente tubulação ls em od ou outro hex / octal despejo utilitário para ver se eles realmente têm o mesmo nome, ou se existem caracteres não imprimíveis envolvidos.

Outras dicas

Eu estou querendo saber o que poderia causar isso. Além de erros do sistema de arquivos, ele pode ser causado por um chararacter não-ascii que obteve através de alguma forma. Nesse caso, use outro idioma com a semântica de cordas mais fácil de fazer a operação.

Seria interessante ver o que seria a saída deste trecho rubi:

ruby -e 'puts Dir["msheehan*"].inspect'

Você pode excluir usando o iNode

Se você usar a opção "-i" em "ls"

$ ls -li
total 1
20801 -rw-r--r-- 1 root root 0 2010-11-08 01:55 a?
20802 -rw-r--r-- 1 root root 0 2010-11-08 01:55 a\?
$ find . -inum 20802 -exec rm {} \;
$ ls -li
total 1
20801 -rw-r--r-- 1 root root 0 2010-11-08 01:55 a?

Eu tenho um exemplo (em espanhol) como você pode excluir um arquivo usando seguida iNode no Solaris http://sparcki.blogspot.com/2010/03 /como-eliminar-archivos-utilizando-su.html

Urko,

E uma resposta rápida para a parte 2 da minha própria pergunta ...

Eu imagino que eu poderia mudar o nome do diretório, exclua o arquivo, e renomear a volta diretório para ele do original novamente.

... Eu ainda estaria interessado em ver o que as outras pessoas vêm com.

JB

Eu suspeito que um deles tem um personagem estranho no nome. Você pode tentar usar a expansão shell curinga para ver que: tipo

cat msh*

e pressione a tecla de expansão curinga (em minha concha é Ctrl-X *). Você deve obter dois nomes na lista, talvez, um dos quais tem um caractere de escape nele.

Para ver se há caracteres especiais em seu arquivo, tente as opções -b ou -q para ls, assumindo solaris 8 tem essas opções.

Como outra solução para apagar o arquivo que você pode abrir o navegador de arquivos gráfico (Surpresa!) E arraste e solte o arquivo indesejado para o lixo.

Outra solução poderia ser a de mover o arquivo para um nome diferente (um sem o carácter especial desconhecido), em seguida, exclua o nome especial diretório personagem com curingas.

mv msheehan temp
rm mshee*
mv temp msheehan

Claro, você quer ter certeza de que somente o arquivo que deseja excluir partidas o curinga. E, para o seu caso particular, uma vez que um era um diretório e o arquivo de um outro, este comando pode ter resolvido tudo:

rmdir msheeha*

Uma maneira rápida e fácil para ver os caracteres não-impressão e espaço em branco é para canalizar a saída através de cat -vet , por exemplo:.

# ls -l | cat -vet

Nice e fácil de lembrar!

Para a parte 2, já que um nome contém dois caracteres extras, você pode usar:

mv sheehan abc
mv sheeha??n xyz

Uma vez feito isso, você tem nomes de arquivos sã novamente, que você pode corrigir-se como você precisa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top