Como renomear o arquivo para .. (ponto ponto)?

26

Aparentemente, você pode renomear o arquivo para... .

Se eu fosse louco, como renomearia arquivo para ..ou .? Esse nome de arquivo é permitido?

A barra invertida não parece desativar o significado especial do ponto:

$ mv test \.
mv: `test' and `./test' are the same file
gronostaj
fonte
11
.e ..já existe. E ponto não tem um significado especial.
Ctrl-alt-delor 5/08/14
2
Gostaria de saber se você pode criar arquivos nomeados .ou ..do Windows para mídia externa FATou NTFS, em seguida, tente montar isso em um sistema baseado em Unix. Hm ...
IQAndreas
3
@IQAndreas não, o Windows usa. e .. da mesma maneira ( superuser.com/a/571364/330318 ) que o Unix faz. (E muito pedaço de outros nomes especiais: superuser.com/a/217526/330318 )
PTwr
2
@PTwr A história do Windows é mais complicada do que isso. Algumas coisas especiais acontecem no nível do sistema de arquivos / API do NT, outras no subsistema Win32 e outras no nível do shell. Por exemplo, a mágica GUID do seu segundo link está no nível do shell, portanto você não as verá em um aplicativo de linha de comando típico. Eu não tenho certeza se .e ..realmente existem em NTFS ea API NT ou se eles são adicionados apenas pela API Win32. Eu sei que existem várias discrepâncias entre o nível mais baixo da API do NT e o Win32, por exemplo, o Win32 oculta vários arquivos da raiz da unidade.
CodesInChaos
@CodesInChaos, tanto quanto eu sei, dot / dotdot são instâncias virtuais e são emuladas no driver do sistema de arquivos, e era o mesmo no antigo FAT que emprestou ( problemática ) a idéia do Unix. De acordo com o segundo link, admito que não o leio completamente antes de postar. Algo como este provavelmente seria melhor. (mas, novamente, esta carece de plena ./ .. info)
PTwr

Respostas:

25

.. não é especial, é só que ele já existe.

No Unix, Dos e MS-Windows, todos os diretórios possuem um diretório .vinculado a si próprio e um diretório ..vinculado ao diretório pai (ou próprio, se o diretório raiz).

Se ..e .for especial, é apenas porque você não pode removê-los (na verdade você pode, basta remover o diretório que os contém).

Portanto, você não pode nomear nenhum arquivo (outro) .ou ...

No entanto, você pode criar arquivos ..., \, , .. (note que existe um espaço após o .., mas você dificilmente pode vê-lo aqui, ou facilmente em você diretório lista) ou qualquer outro que você, como nome; O único caractere reservado é /(Aviso - detalhes avançados: e null, null é um caractere especial, não usado para nada, exceto para marcar o fim das coisas e, às vezes, como um separador). .não tem significado especial: não para nomes de arquivos, kernel ou shell, ele não precisa ser escapado. Na verdade, se um nome de arquivo começa com a, .então é especial, o arquivo normalmente está oculto, mas ainda não precisa ser escapado.

a parte, de lado

Esse comportamento de arquivo oculto surgiu em uma implementação inicial de lsonde o autor queria ocultar .e .., portanto, eles escreveram código para ocultar todos os arquivos começando com a .. Outros usuários perceberam esse bug / recurso e começaram a criar arquivos começando com a .quando eles queriam que o arquivo fosse oculto.

Explicação da pergunta vinculada

Na pergunta que você vincula ao questionador, está tentando mover o arquivo para o diretório pai, ..mas acaba renomeando para ..., os arquivos que começam com um ponto ficam ocultos por padrão, por isso não conseguem encontrá-lo.

Ao usar mv no formulário mv a b

  • Se você mudar para .ele, efetivamente, é uma operação sem, mas mvtrata-o como um erro.
  • Se você mudar para ..ele, o arquivo será movido para o diretório pai.
ctrl-alt-delor
fonte
1
Como assim If you move to . it is effectively a no operation? Não é um "não operacional", é um erro se você tentar mover um arquivo de A para B quando A e B são a mesma coisa. Uma demonstração mais prática desse erro é mv foo ../some_dir/fooou mv foo some_subdir/../foo.
Brandin
7
Para alguma definição de 'caractere', NUL (0x00) também é restrito ao uso em nomes de arquivos e diretórios.
user117529
1
A distinção entre caracteres reservados (ie /e NUL) e nome reservado (ie .e ..) poderia ser mais clara. Também vale ressaltar que, .no início do nome, tem um significado especial apenas na camada de aplicação e não na API de chamada do kernel ou do sistema.
precisa saber é o seguinte
Eu acho que seu espaço se perdeu.
usar o seguinte código
1
..e . são especiais: você não pode movê-los ou removê-los. Mas eles não são especiais ao mover arquivos para eles.
reinierpost
52

Você não pode renomear um arquivo para .ou ..porque todos os diretórios já contêm entradas para esses dois nomes. (Essas entradas apontam para diretórios e você não pode renomear um arquivo para um diretório.)

mv detecta o caso em que o destino é um diretório existente e o interpreta como uma solicitação para mover o arquivo para esse diretório (usando seu nome atual).

As barras invertidas não têm nada a ver com isso, porque .não é um metacaractere do shell. \.e .são os mesmos para bash.

cjm
fonte
9

O problema é que você está movendo um arquivo para um diretório. Isso pode falhar.

Vou lhe contar como era antes.

O mkdir costumava ler isso (enquanto escrevo em sh, foi realmente escrito em C e setuid-root).

mknod d $1
ln -d $1 $1/.
ln -d `dirname $1` $1/..

Então, como você pode ver, não há muito especial. e .. exceto pelo fato de que eles foram criados para você pelo mkdir e já existem. Agora existe um código que diz que você não pode removê-lo, mas nem sempre foi o caso.

rmdir costumava ficar assim:

rm -d $1/..
rm -d $1/.
rm -d $1
Joshua
fonte
+1 na lição de história e adicionando algo que não está coberto adequadamente.
Ctrl-alt-delor