Arquivo e diretório com o mesmo nome no mesmo diretório pai - Solaris 8, UFS
-
01-07-2019 - |
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:
- O que há com isso?
- 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!
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.