Qual é o termo técnico para o diretório atual (.) E o pai (..)?

20

Eu tenho uma função que verifica se o nome do arquivo passado é .ou ... Mas não sei como nomeá-lo corretamente. Algo como IsCurrentOrParentDirectory()é ambíguo, pois a função assume um nome de arquivo e não um caminho completo. (Intuitivamente, um colega programador esperaria que passasse /usr/enquanto eu /usr/voltasse true, embora esse não seja realmente o caso.)

Existe um termo técnico para essas entradas de diretório? Se houver, o que é?

Max Truxa
fonte
1
. e .. NÃO são nomes de arquivos, mas pastas. Por que você não apenas verifica se a entrada é um arquivo válido (digite de acordo com stat () é IF_REG)? PS Este é provavelmente mais adequado para StackOverflow
Tonny
7
@Tonny .e .. são nomes de arquivos de acordo com o padrão POSIX. Veja minha citação abaixo. Eu diria que está bem aqui, pois trata de conceitos gerais de computação.
slhck 23/07
Devo admitir que minha redação foi ambígua novamente. A função usa um único arquivo ou nome do diretório ( foo.bar, foo...), mas não um caminho ( foo/bar, /foo/...). Mas como diretórios, links etc. também são arquivos, deixarei assim.
Max Truxa
@slhck O POSIX o chama de arquivo, mas o faz para QUALQUER objeto do sistema de arquivos. O arquivo na terminologia POSIX geralmente deve ser lido como uma abreviação de "objeto do sistema de arquivos". No início do Unix, ele deriva todos os FSOs onde realmente é o arquivo, mas isso não é verdade para algumas implementações modernas e certamente não para sistemas operacionais que não sejam o Unix, mas compatíveis com o POSIX (Windows NT como exemplo mais óbvio). - Eu provavelmente deveria ter escrito "é um arquivo regular" em vez de "arquivo válido" no meu comentário, mas o comentário de Max Truxa o torna um ponto discutível de qualquer maneira.
Tonny 23/07

Respostas:

23

Do padrão POSIX :

O ponto do nome do arquivo especial deve se referir ao diretório especificado por seu antecessor. O nome do arquivo especial ponto-ponto deve se referir ao diretório pai do diretório predecessor. Como um caso especial, no diretório raiz, ponto a ponto pode se referir ao próprio diretório raiz.

Então, realmente, se você quiser verificar se o nome do arquivo é .ou ..teria que chamá-lo IsDotOrDotDot(), ou, usando a terminologia POSIX de resolução do nome do caminho IsPredecessorOrParentOfPredecessor(), ou talvez até PointsToPredecessorOrParentOfPrecedessor()... você entendeu. O problema é que a última terminologia só faz sentido quando se olha nomes de caminho completos. Mas ninguém entenderia isso de qualquer maneira.

Considerando que .e ..são nomes de arquivos válidos (apenas interpretados de maneira diferente), você deve apenas seguir o que tem, baseando-se no significado e não na forma como eles são chamados internamente.

slhck
fonte
.bash_historyPonto é ou não ponto? Não tenho certeza se esse nome da função é mais descritivo do que o aberto proposto pelo OP.
Jens Erat
@JensErat Isso é irrelevante para o problema. A questão era se o componente do nome do arquivo era .ou ..não, e se ele apenas começou com a .. É claro que o nome da função do OP é mais descritivo; Eu estava apenas apontando para ele como é tecnicamente referido.
slhck 23/07
2
Claro que é, mas não IsDotOrDotDot()diz praticamente nada sobre o que a função está fazendo.
Jens Erat
"predecessor" refere-se ao elemento do caminho imediatamente antes dele na especificação do caminho. Se você está apenas olhando os nomes das entradas em um diretório, "atual" ou "pai" é uma terminologia melhor.
Simon Richter
2
@JensErat eu usaria IsDotOrDotDot. Qualquer pessoa conhecedora dos conceitos de sistema de arquivos entenderia instantaneamente. É discutível se .bash_historyé "ponto" porque nenhum contexto é fornecido para o significado de "ponto", mas definitivamente NÃO é "ponto ou ponto".
23914 kinokijuf
4

.e ..geralmente são usados ​​para descrever caminhos relativos versus caminhos absolutos /usr. Eu usaria essa diferença e declararia a função como IsRelativeCurrentOrParentDirectory().

Esteja ciente de que as referências a pontos podem ocorrer em qualquer lugar do caminho. Que tal /usr/local/..?

Jens Erat
fonte
Não consegui apontar que a função usa apenas um nome de arquivo e não um caminho completo. Eu atualizei a pergunta de acordo.
Max Truxa
2

O Padrão POSIX, que slhck ♦ citou utilmente, diz:

O ponto do nome do arquivo especial deve se referir a….  O nome do arquivo especial ponto-ponto deve se referir a….

(enfase adicionada). Portanto, embora não seja exatamente técnico , parece que "nome de arquivo especial" pode ser o nome oficial . Seus usuários provavelmente compreendê-lo se você chamou sua função de qualquer um dos seguintes: IsSpecialDirectory(), IsSpecialFilename()ou, simplesmente IsSpecialName().

Ou você poderia ir com IsStandardDirectory(), IsStandardFilename()ou IsStandardName(). Isso segue a convenção de nomenclatura do Unix (entrada padrão, saída padrão) para itens que são estabelecidos automaticamente para você (neste caso, por mkfse mkdir).  IsAutomatic…()ou IsDefault…(), por outro lado, provavelmente não são intuitivos o suficiente.

Scott
fonte
Na verdade, o primeiro nome que eu escolhi foi IsMagicDirectory()muito próximo disso, mas acho que sua redação é muito mais intuitiva e apropriada (especialmente porque usa convenções de nomenclatura estabelecidas). O uso IsSpecialFileNamedeixaria claro que a função não recebe um caminho, mas um único nome de arquivo (ou diretório, link, etc.).
Max Truxa
Boa sugestão. "Especial", no entanto, provavelmente incluiria também links, FIFOs, etc., certo?
slhck 24/07
@slhck: Sim, os dispositivos (por exemplo, discos e ttys) são chamados de "arquivos especiais". E, sim, o termo pode ser aplicado livremente a links simbólicos, FIFOs e outros habitantes exóticos do sistema de arquivos - qualquer tipo de arquivo (nó-i) que não seja um “arquivo regular”. (Sim, os diretórios também se enquadram nesse balde.) Portanto, IsSpecialFile()seria uma má sugestão. Mas eu não sugeri isso; Eu sugeri IsSpecialFilename(). Enquanto os nomes sda1, console, kmem, myfifoe urandomsão sugestivos, eles não são reservados e não são inerentemente especial. Mas .e ..são nomes de arquivos inerentemente especiais .
Scott
1

O único termo que conheço no mundo * nix é CWDpara o Diretório de trabalho atual. Isso é realmente usado com bastante frequência. Veja, por exemplo, /proc/$$/cwdqual é um link para o diretório a partir do qual você executa o comando.

Não conheço nenhum nome padrão para ..além de, dot-dote como o @slhck apontou, essa não é uma boa escolha.

Terdon
fonte
0

O Posix é bastante ambíguo ao falar sobre relacionamentos de diretório pai-filho. Como já foi dito, ./ ..não é útil ao falar ou comunicar com outros seres humanos.

As estruturas de arquivos podem ser pensadas como uma estrutura de dados em árvore. Aqui, geralmente "pai" e "filho" ou "filha" são suficientes para transmitir significado. Você verá que os livros didáticos da estrutura de dados têm essa convenção

Como alternativa, parece que as árvores podem ser mencionadas como "para cima" e "para baixo" da árvore. Por convenção, "para cima" significa mais próximo do diretório raiz e "para baixo" refere-se ao (s) filho (s).

Eu acho que uma IsCurrentOrUp()ou IsCurrentOrParent()pode ser uma boa prática para nomear funções.

CodeOcelot
fonte