Timestamps de um diretório?

3
  1. Sobre o mtime de um diretório, da resposta de Stéphane Chazelas link

    The modification time of a directory, like any other file (note how directories are called directories (a list of name/number mappings like a phone directory) and not folders) is updated whenever the content is modified.

    That is when a file is added (linked), removed (unlinked), or renamed in it.

    Significa que o conteúdo de um diretório sobre um arquivo derivado é apenas o nome do arquivo filho e o número de hardlinks para o arquivo arquivo filho?

    Se não, que outras informações de um arquivo filho estão no conteúdo do diretório pai?

    Em outras palavras, alterar o arquivo filho também alterará o horário de seu diretório pai?

  2. Quando o atime de um diretório muda? Eu achei que nenhum dos ls -l , ls -ld e cd altera a hora de um diretório. Eu pensei que os comandos exibem o conteúdo do diretório e, portanto, lê o conteúdo do diretório?

  3. Quando o ctime de um diretório é alterado?

Obrigado.

    
por Tim 06.05.2015 / 19:31

1 resposta

3

Pense em um diretório como um arquivo de texto parecido com:

123:foo.txt
234:bar.txt
123:other-name-for-foo.txt

Isso é tudo (pelo menos nos sistemas de arquivos tradicionais do Unix).

foo.txt não é um filho desse diretório, pois não é um relacionamento exclusivo. É apenas que o arquivo do número de inode 123 é referenciado em duas entradas desse diretório: com nomes foo.txt e other-name-for-foo.txt .

Essas duas entradas de diretório também são conhecidas como dois links hard para o mesmo arquivo.

$ touch foo.txt bar.txt
$ mkdir other-dir
$ ln foo.txt other-name-for-foo.txt
$ ln foo.txt other-dir/whatever
$ ls -i . other-dir
.:
58892735 bar.txt  58958143 other-dir/
58879562 foo.txt  58879562 other-name-for-foo.txt

other-dir:
58879562 whatever

. e other-dir são dois arquivos do tipo diretório , cada um contendo várias entradas de diretório. ls lista as entradas de um diretório cujos nomes não começam com . e com -i inclui o número de inode.

Com -a (para incluir dotfiles) e -i ( ls -ai ), é mais ou menos jogando o conteúdo desse arquivo de texto que mencionei acima.

Você notará que o arquivo de inode 58879562 acima está vinculado uma vez a other-dir e duas vezes a . . O arquivo 58879562 agora tem uma contagem de links de 3, mas nem . nem other-dir se preocupam com isso. Essa informação é armazenada no inode do arquivo e é apenas para o sistema manter o controle de quantas vezes o arquivo está vinculado a um diretório. Se esse número cair para 0, o espaço em disco ocupado por esse arquivo poderá ser recuperado.

Além do nome e do número do inode, os diretórios também contêm o tipo de arquivo do arquivo (regular / fifo / directory / symlink / device ..., embora não para todos os sistemas de arquivos). Essa informação pode ser recuperada de outra forma (como é armazenada no inode), portanto não é necessário. Isso é feito principalmente para fins de otimização e porque é possível. Isso é possível porque não é possível alterar o tipo de um arquivo (ao contrário de outros metadados), para que as informações armazenadas no diretório não fiquem fora de sincronia com a realidade.

Você também notará que a chamada do sistema para remover um arquivo não é remove("/foo/bar") , mas unlink("/foo/bar") . Isso porque tudo o que faz é remover a entrada bar do diretório /foo , desvincular bar de /foo . Esse arquivo ainda pode estar vinculado a outro diretório (ou o mesmo por um nome diferente). Ele só será removido quando sua contagem de links chegar a zero (quando não estiver mais vinculada a nenhum diretório).

Por que fazer ls não atualiza o tempo de acesso de um diretório, provavelmente porque seu sistema de arquivos está montado com a opção noatime ou relatime .

Atualizar o tempo de acesso de um arquivo (diretório ou outro) toda vez que é lido é caro, então muitos sistemas desistem disso hoje em dia.

Observe que o sistema, se não o usuário, lê diretórios o tempo todo.

Por exemplo, ao acessar /foo/bar , o sistema precisa ler o conteúdo de / para localizar foo e, em seguida, /foo para localizar bar (embora na maioria das vezes essa informação seja armazenada em cache). No entanto, nesses casos, o atime não é atualizado (felizmente), apenas quando os processos do espaço do usuário explicitamente leem o conteúdo de um diretório como ls .

Quanto a quando o ctime de um diretório é atualizado, é o mesmo que para um arquivo normal: quando seu conteúdo é modificado (entradas adicionadas ou removidas ou renomeadas) ou seus metadados (exceto atime na leitura) é modificado (como em chmod / chown , modificações de ACL ...).

    
por 06.05.2015 / 22:00