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

24

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

Se eu fosse insano, como renomeia o arquivo para .. ou . ? Esse nome de arquivo é permitido mesmo?

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

$ mv test \.
mv: 'test' and './test' are the same file
    
por gronostaj 05.08.2014 / 19:45

3 respostas

49

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 iguais para bash .

    
por 05.08.2014 / 19:50
22

.. não é especial, é apenas que já existe.

Em Unix, Dos e MS-Windows, cada diretório tem um diretório . , ele se conecta a si mesmo, e um diretório .. liga para o seu diretório pai (ou auto, se o diretório raiz).

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

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

No entanto, você pode criar arquivos ... , \ , , ..  (observe que há um espaço após o .. , mas você dificilmente pode vê-lo aqui ou facilmente na listagem do diretório) ou qualquer outro nome que você goste; O caractere reservado somente é / (Aviso - detalhes avançados: e nulo, nulo é um caractere especial, não usado para nada, exceto para marcar o final das coisas e às vezes como um separador). . não tem um significado especial: não para nomes de arquivos, kernel ou para o shell, ele não precisa escapar. Na verdade, se um nome de arquivo começar com . , então é especial, o arquivo normalmente é oculto, mas ainda assim não precisa escapar.

Aparte

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

Explicação da questão vinculada

Na pergunta que você faz o link para o questionador está tentando mover o arquivo para o diretório pai .. mas acaba renomeando para ... , os arquivos que começam com um ponto são ocultos por padrão, é por isso que eles não conseguem encontrar isso.

Ao usar mv no formulário mv a b

  • Se você mudar para . , será efetivamente uma operação no, mas mv a tratará como um erro.
  • Se você mudar para .. , moverá o arquivo para o diretório pai.
por 05.08.2014 / 19:51
8

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

Vou contar como foi antigamente.

mkdir costumava ler isto essencialmente (enquanto escrevo isso no 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 é muito especial. e .. exceto pelo fato de que eles são criados para você pelo mkdir e já existem. Há código agora que diz que você não pode removê-los, mas nem sempre foi o caso.

rmdir costumava ficar assim:

rm -d $1/..
rm -d $1/.
rm -d $1
    
por 07.08.2014 / 12:40