Quais são os usos legítimos do comando 'touch'?

82

Qual é o objetivo do comando touch ? Eu sei que posso criar arquivos vazios com ele, mas também é o caso de echo -n .

Caso contrário, por que alguém precisaria alterar os registros de data e hora de um arquivo? A menos que crie uma impressão falsa sobre a idade de um arquivo, não vejo outro uso, e este não é legítimo (do meu ponto de vista).

    
por Quora Feans 12.01.2014 / 17:37

15 respostas

98

Uma vantagem de touch é que ela pode especificar registros de data e hora arbitrários, enquanto echo -n sempre resultará na hora atual.

Um exemplo de uso legítimo é atualizar um timestamp de um arquivo de código-fonte para que um programa como make considere o arquivo de origem mais recente do que seu objeto compilado e o reconstrua.

Outros usos são para criar arquivos que funcionam apenas com base em sua existência, por exemplo, /etc/nologin , que não permite logins, se existir. Eu também argumentaria que touch myfile é uma construção mais simples que echo -n >> myfile , além de ser mais curta para digitar.

    
por 12.01.2014 / 17:55
40

A chamada do sistema subjacente ( utime ) é importante para vários utilitários, como tar , poder definir os registros de data e hora de um arquivo recém-copiado (sem alcatrão). Alguns utilitários de backup também podem ter a opção de redefinir o último horário de acesso dos arquivos copiados.

Um uso legítimo de touch é criar um arquivo com um timestamp específico. Esse arquivo de "referência" pode ser usado por comandos como find . Por exemplo, para localizar todos os arquivos modificados mais recentemente do que 1º de novembro de 2013 (ou seja, 2013/11/01) "

touch -amt 201311010000 myref
find . -type f -newer myref -exec ls -ld {} +
    
por 12.01.2014 / 17:55
39

A principal finalidade do comando touch é manipular os registros de data e hora dos arquivos e para criar arquivos.

Exemplos

1. criando arquivos

$ ls -l
total 0

$ touch file{1..3}

$ ls -l
total 0
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file1
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file2
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file3

NOTA: A saída total 0 de ls -l está correta. Essa implementação de ls mostra o número de blocos sendo usados pelos arquivos quando eles são listados. Você pode se certificar desse fato adicionando a opção -s a ls . Isso listará os blocos em uso por cada arquivo. Aqui eu adicionei 2 caracteres ao arquivo1 & arquivo2.

Exemplo

$ ls -ls
total 8
4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:07 file1
4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:09 file2
0 -rw-rw-r--. 1 saml saml 0 Jan 13 12:05 file3

2. informações de hora / data de um arquivo - comando stat

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2014-01-12 13:33:38.279456149 -0500
Modify: 2014-01-12 13:33:38.279456149 -0500
Change: 2014-01-12 13:33:38.279456149 -0500
 Birth: -

Podemos usar touch para manipular os vários timestamps em um determinado arquivo.

3. trecho da página man do touch

   -a     change only the access time
   -m     change only the modification time
   -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time

4. manipulando o tempo de acesso

$ touch -a -t200001010000 file1

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2000-01-01 00:00:00.000000000 -0500
Modify: 2014-01-12 13:33:38.279456149 -0500
Change: 2014-01-12 13:38:52.023434696 -0500
 Birth: -

5. manipular o tempo de modificação

$ touch -m -t200001010000 file1

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2000-01-01 00:00:00.000000000 -0500
Modify: 2000-01-01 00:00:00.000000000 -0500
Change: 2014-01-12 13:39:31.060432026 -0500
 Birth: -

Você pode estar se perguntando sobre o tempo de alteração (ctime). Isso não pode ser manipulado usando touch . Isso rastreia o tempo em que qualquer um dos metadados foi tocado no arquivo. Veja este livro Q & A para mais detalhes, intitulado: O que você pode fazer para um arquivo sem acionar o registro de data e hora" Alterar "? .

    
por 12.01.2014 / 19:43
20

Um dos usos mais comuns de touch é - ou pelo menos costumava ser - para acionar uma reconstrução de código.

As ferramentas de compilação usuais - make e suas derivadas - tentam salvar o trabalho não recompilando / reconstruindo arquivos, a menos que um dos arquivos que foram criados seja alterado - por exemplo, se um arquivo .o for mais recente que a fonte .c, geralmente é seguro presumir que a fonte C não foi alterada desde que foi compilada para produzir esse arquivo de objeto.

Mas há momentos em que você quer forçar algo a ser reconstruído. Você pode fazer uma modificação desnecessária em um de seus arquivos de origem, mas isso pode causar danos a algo acidentalmente. Em vez disso, você poderia simplesmente touch do arquivo, fazendo com que parecesse novo sem qualquer risco de alterar seu conteúdo - e isso seria suficiente para convencer make de que era hora de reconstruir tudo o que dependesse desse arquivo.

Existem outros usos, mas historicamente esse foi o grande problema.

    
por 13.01.2014 / 03:00
19

Além das outras duas respostas muito boas que você recebeu, outro uso é, em suas palavras, para

create the false impression about the age of a file

por exemplo, para uso em esquemas de backup . Talvez você não queira atualizar um backup com um mais novo, uma vez que são idênticas ou porque as alterações são irrelevantes em comparação com a despesa de atualização de um backup, digamos, em uma linha lenta para um host remoto. Para conseguir isso, você tem a opção simples de marcar o arquivo de backup com um timestamp mais recente, não faking , mas declarando que o timestamp de validade desse arquivo agora é diferente.

A impressão sobre a idade do arquivo agora é de fato falsa, mas seu significado é real e legítimo.

    
por 12.01.2014 / 18:22
11

Eu trabalhei com pelo menos um framework web (não lembro qual) que no modo de desenvolvimento assisti os arquivos de código fonte para mudanças e recarreguei o aplicativo quando isso aconteceu.

É claro que às vezes você queria que ele fosse recarregado depois de alterar algo que não estava assistindo, e nesse caso touch ing seu arquivo de configuração principal resolveu o problema.

Assim, no caso geral, sempre que você quiser iniciar um processo acionado por alterações em um arquivo, sem realmente alterar o arquivo.

    
por 13.01.2014 / 00:20
11

Uso legítimo do toque:

  • Atualize o registro de data e hora dos arquivos de imagem (GIF / JPG / etc) para a hora em que foram tirados. Nem todos os representantes leem ou atendem às informações EXIF.
  • Mantenha o tempo c / m quando atualiza em massa um conjunto de arquivos em que o registro de data e hora é importante para o pacote de arquivos.
  • Defina a hora de um arquivo em lote (isto é, CSV) se você precisar fazer outra importação após uma falha, e o programa de importação dependerá da data e hora (deixe essa discussão para outro tópico :-))
  • Finalidades de arquivamento, ou seja, ter backups em pastas com base no ano e, em seguida, definir a hora nessas pastas para 1º de janeiro de 2008 para facilitar a classificação
por 13.01.2014 / 09:08
7

Um uso é corrigir o registro de data e hora de um arquivo que foi configurado incorretamente.

Por exemplo, a maioria das maneiras de copiar um arquivo (e, de alguma forma, mover um arquivo) faz com que o novo arquivo tenha um registro de data e hora do horário atual, em vez do registro de data e hora do arquivo original.

Normalmente, isso não é o desejado. O toque pode "consertar" isso.

Outro uso é refletir uma modificação de arquivo que foi desfeita restaurando o registro de data e hora do arquivo para o que era antes das operações "editar ... desfazer-editar".

    
por 13.01.2014 / 03:43
5

Uma diferença importante em relação a things como echo (ou ainda melhor > file , como mencionado por outros) é que o toque não estraga o conteúdo. > file irá esvaziar um arquivo. touch não. Em vez de pensar em truques para evitar danos ao conteúdo, basta usar o toque! Ele fará menos trabalho no kernel de qualquer maneira, porque funcionará apenas com os atributos do arquivo sem perder tempo preparando-se para um aberto e depois executando um fechamento.

O toque provavelmente pode alterar o registro de data e hora, mesmo que o arquivo esteja atualmente com um bloqueio obrigatório ou de consultoria ou um bloqueio exclusivo. Hmmm, nunca testei isso ou li sobre isso ...

    
por 12.01.2014 / 23:34
4

Aqui está uma - eu uso um programa de software chamado SageTV para gravar programas de TV - eles são geralmente gravados em MPEG-2, que não é um codec muito eficiente, mas também não é compatível com iPad / iPhone. Então eu converto os arquivos para arquivos .mp4. Mas ao reproduzir os arquivos, a SageTV espera que o timestamp do arquivo esteja quando o programa de TV começar - se não, ele estraga a linha do tempo do programa para que não seja fácil para FF ou REW. Portanto, eu uso o touch para redefinir o registro de data e hora do arquivo .mp4 para ser o mesmo que o arquivo original. Isso é legal?

    
por 13.01.2014 / 16:31
2

Muitas vezes, você pode ter um processo que muda de userid, como de root - > algo mais. O Touch pode dar a você a chance de criar um arquivo em um local que somente o root pode tocar antes que o aplicativo inicie o login como outro usuário.

    
por 12.01.2014 / 22:41
2

No trabalho, temos um arquivo de mapas digitais com mais de 15 anos. Esses mapas antigos são salvos em vários formatos, como PostScript, EMF, PRN, hpgl2, pdf etc., que a maioria dos programas não entende. Ou você precisa de uma dúzia de programas diferentes para ver todos eles.

Para facilitar a pesquisa e a navegação em todos esses diferentes formatos, criamos versões JPEG dos mapas e, em seguida, usamos o toque para fazer com que o arquivo jpeg corresponda ao registro de data e hora do arquivo de origem original - muitas vezes anos após o original.

Agora, podemos usar um único programa, como o Picasa, para ver toda a biblioteca e localizar alguns períodos. Sem o toque, teríamos que adicionar metadados de data para cada imagem individualmente, provavelmente manualmente, e depois pesquisar essas sequências ao procurar um intervalo de datas específico.

    
por 14.01.2014 / 07:27
1

Eu ainda não usei para essa finalidade, mas tenho um script que lê os arquivos e suas datas de um diretório e os lê para uso em uma página da web. Se eu tiver que editar um, ele mudará a data. Eu considerei touch ing resetando seu pedido.

    
por 14.01.2014 / 01:53
1

Alguns scripts de inicialização comparam o timestamp de um arquivo de configuração com seu próprio arquivo pid. O resultado decide se é necessário recarregar o serviço em execução ou não.

Se houver uma situação em que você não deseja alterar a configuração, mas deseja forçar o recarregamento, toque em ajuda aqui.

    
por 14.01.2014 / 20:41
0

Eu tenho uma tarefa cron que obtém as alterações de um banco de dados que ocorreu entre a última execução da tarefa e a execução atual. Produz um arquivo XML das mudanças que são então processadas em um banco de dados diferente. Obtém o último tempo de execução do registro de data e hora no arquivo de saída XML. *

Se algo der errado no processamento do arquivo XML, talvez queira repetir a execução a partir da data original, não da data mencionada no registro de data e hora do novo arquivo XML.

A maneira mais simples de fazer isso, em vez de editar os scripts que são chamados, etc., é tocar no arquivo XML e forçar a data e a hora a serem solicitadas.

Além disso, se eu começar de novo (sem nenhum arquivo de saída XML anterior), posso simplesmente simular sua existência usando o toque.

[*] Antes que alguém aponte - percebo a hora em que o trabalho começa e a gravação do arquivo XML deixa uma lacuna de tempo de alguns minutos em que as mudanças no banco de dados podem ocorrer. O job é executado no momento em que as alterações do banco de dados são extremamente improváveis. Essa é a minha desculpa e eu estou aderindo a ela: -)

    
por 15.01.2014 / 18:31