O comportamento é esperado, se não for óbvio. Pelo menos no meu sistema, touch
faz
utimensat(0, NULL, NULL, 0)
no primeiro caso ( touch file
) e
utimensat(0, NULL, [UTIME_OMIT, UTIME_NOW], 0)
no segundo ( touch -m file
). A primeira chamada é curta para "definir os horários de acesso e modificação para a hora atual"; o segundo diz "deixe o tempo de acesso sozinho e mude a hora da modificação para a hora atual".
POSIX diz
Only a process with the effective user ID equal to the user ID of the file, or with write access to the file, or with appropriate privileges may use futimens() or utimensat() with a null pointer as the times argument or with both tv_nsec fields set to the special value UTIME_NOW. Only a process with the effective user ID equal to the user ID of the file or with appropriate privileges may use futimens() or utimensat() with a non-null times argument that does not have both tv_nsec fields set to UTIME_NOW and does not have both tv_nsec fields set to UTIME_OMIT.
( times
é o terceiro argumento para utimensat()
). touch file
cai sob o primeiro conjunto de restrições de acesso: qualquer acesso de gravação ao arquivo permite que os horários de acesso e modificação sejam alterados para "agora". touch -m file
cai sob o segundo conjunto de restrições de acesso: você precisa ser root
ou o proprietário do arquivo para poder alterar os tempos de acesso e modificação para valores que não são "agora" ou ambos "inalterados" .
Existem outras maneiras de alterar o tempo de acesso e / ou modificação para "agora" em arquivos que você não possui, mas pode ler ou escrever:
- a leitura de um arquivo atualizará apenas o tempo de acesso;
- gravar um arquivo ( sem lê-lo) atualizará apenas o horário da modificação.