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

83

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

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

Quora Feans
fonte
15
em vez de echo -n > filename, você pode executar o seguinte:>filename
AMADANON Inc.
77
Quais são os usos ilegítimos ?
precisa saber é
10
Unless to create the false impression about the age of a file. Não é necessária impressão falsa. E se você quiser alterar o horário da modificação? Pode ser útil em scripts. Esse script depende muito do touchcomando e é muito conveniente e simples tê-lo assim.
VL-80
7
Considere o que tar(ou outros arquivadores) fazem quando extraem um arquivo. Geralmente, eles definem a hora da modificação do arquivo como a hora do arquivo morto, não a hora em que o arquivo foi extraído, e esse é um recurso desejável. Como é legítimo que um programa no modo de usuário crie carimbos de data / hora falsos, não há muito argumento por que touch(ou algum outro programa de linha de comando) não deve permitir isso com base em um argumento de linha de comando. Aprender C não torná-lo mais legítimo do que alguém escrevendo um shroteiro ;-)
Steve Jessop
5
No unix, não há registro de data e hora que descreva o agearquivo. Esse seria um creationregistro de data e hora e não existe um registro de data e hora para arquivos no unix.
precisa saber é o seguinte

Respostas:

98

Uma vantagem touché que ele pode especificar carimbos de hora arbitrários, enquanto echo -nsempre resultará no horário atual.

Um exemplo de uso legítimo é atualizar um registro de data e hora de um arquivo de código-fonte, para que um programa como makeo considere o arquivo de origem mais novo que seu objeto compilado e o reconstrua.

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

Casey
fonte
18
outro uso comum: toque em um arquivo para uma data específica e, em seguida, "encontre / -newer / the / file" para encontrar todos os arquivos alterados / criados depois dele
Olivier Dulac
@casey Quando verifiquei a documentação echo -n, vejo que diz "não produza a nova linha à direita". Portanto, não vejo como isso pode criar um arquivo vazio. Você pode esclarecer por favor?
Geek
3
O @Geek echo -nproduzirá uma string vazia e, por si só, não faz nada. Redirecionar sua saída via >>faz com que a saída vazia seja anexada a um arquivo. O redirecionamento fará com que o arquivo seja criado se o arquivo não existir.
casey
6
Isso não funciona: abrir um arquivo existente para saída, mas não gravá-lo, não altera o mtime (no meu sistema, de qualquer maneira). Mesmo assim, você não precisa e não deve usar echo -num comando que não faz nada. echo -npode gerar a string "-n" sob algumas conchas. Se você realmente precisa de um comando que não faz nada :ou trueé uma opção melhor, mas >> myfilepor si só também é uma maneira perfeitamente válida de criar o arquivo, se ele não existir. Tudo isso, é claro, suporta sua resposta de que você deve apenas usar "toque".
hvd 13/01
40

A chamada de sistema subjacente ( utime) é importante para vários utilitários, como tarpoder definir os carimbos de data e hora de um arquivo recém-copiado (sem tarar). Alguns utilitários de backup também podem ter a opção de redefinir a última hora de acesso dos arquivos que eles copiaram.

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

touch -amt 201311010000 myref
find . -type f -newer myref -exec ls -ld {} +
JRFerguson
fonte
Como calcular isso 201311010000 significa Nov1,2013? Existe um utilitário que me diga isso? Em outras palavras, como determino a entrada a ser tocada?
Geek
4
@Geek Observando o número e observando que a primeira parte,, 20131101pode ser dividida em 2013-11-01ou 1º de novembro de 2013. Você pode assumir que a 0000parte indica uma hora específica do dia, neste caso, 00 horas e 00 minutos. Ou você pode simplesmente olhar para a página de manual touch, que informa exatamente qual é o formato (consulte -t).
JAB
@Geek Os manpages são seu amigo :-)
JRFerguson
39

O touchobjetivo principal do comando é manipular os registros de data e hora dos arquivos e 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 total 0saída de ls -lestá correta. Esta implementação lsmostra o número de blocos que estão sendo usados ​​pelos arquivos quando eles estão listados. Você pode garantir esse fato adicionando a -sopção a ls. Isso listará os blocos em uso por cada arquivo. Aqui eu adicionei 2 caracteres para o arquivo1 e o 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 touchpara manipular os vários carimbos de data e hora em um determinado arquivo.

3. trecho da página do manual 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. manipulação do 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. manipule 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 horário da mudança (ctime). Isso não pode ser manipulado usando touch. Isso rastreia a hora em que qualquer um dos metadados foi tocado no arquivo. Consulte estas perguntas e respostas sobre perguntas e respostas para obter mais detalhes, intitulado: O que você pode fazer em um arquivo sem disparar o carimbo de data / hora "Alterar"? .

slm
fonte
@ sim: minha pergunta implica que eu sei que o toque é para alterar os timestamps. Eu só queria saber por que um usuário honesto iria querer isso. Se não fosse a parte ctime da sua resposta, eu teria lhe dado um -1.
Quora Feans
16
@QuoraFea - minha resposta é para seu benefício e para qualquer usuário que se deparar com isso no futuro. Por favor, não suponha que uma resposta seja puramente por sua causa e me desculpe se eu o ofendi de alguma forma, não era minha intenção, eu estava apenas tentando explicar os fundamentos de como o tempo funciona.
slm
@ sim: Não estou ofendido, apenas pensei que a resposta não estava indo na direção certa. De qualquer forma, obrigado por esta resposta.
Quora Feans
@QuoraFea - de nada, e obrigado pelo seu Q. Eles são apreciados!
slm
11
@ Geek - tente os comandos. Essa é a saída correta de ls -lum diretório em que os arquivos têm tamanho 0 e nada mais existe ainda. Assim que você especificar um tamanho de arquivo, o total será exibido com a quantidade de blocos em uso pelos arquivos. Veja minhas atualizações, se não tiver certeza, adicionamos um exemplo.
slm
20

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

crie a impressão falsa sobre a idade de um arquivo

por exemplo, para uso em esquemas de backup . Você pode não atualizar um backup com um mais novo, pois eles são idênticos ou porque as alterações são irrelevantes em comparação com as despesas de atualização de um backup em, por exemplo, uma linha lenta para um host remoto. Para conseguir isso, você tem a opção simples de marcar o arquivo de backup com um carimbo de data / hora mais recente, não fingindo, mas declarando que o carimbo de data / hora de validade desse arquivo agora é diferente.

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

LSerni
fonte
20

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

As ferramentas de construção habituais - makee suas derivadas - tentam salvar o trabalho não recompilando / reconstruindo arquivos, a menos que um dos arquivos que os criou foi alterado - por exemplo, se um arquivo .o for mais recente que o .c fonte, 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ê deseja forçar algo a ser reconstruído. Você pode fazer uma modificação desnecessária em um de seus arquivos de origem, mas isso corre o risco de danificar acidentalmente algo. Em vez disso, você pode simplesmente touchusar o arquivo, fazendo com que ele pareça novo sem nenhum risco de alterar seu conteúdo - e isso seria suficiente para convencer makeque era hora de reconstruir tudo o que depende desse arquivo.

Existem outros usos, mas historicamente esse foi o grande.

keshlam
fonte
Embora pareça uma boa ideia alterar um arquivo para causar uma reconstrução, eu argumentaria contra. Alguns sistemas de revisão de código-fonte podem ficar confusos sobre um arquivo alterado. Então, touché tão ruim quanto uma mudança manual. Para causar uma reconstrução, sugiro excluir os arquivos .ode saída da fonte em questão.
harper
11
As alterações manuais e a remoção dos arquivos .o requerem mais tempo e digitação, e uma alteração manual é muito mais suscetível a erros. E estamos falando apenas de modificar o carimbo de data e hora em uma cópia de trabalho - se forem feitas edições depois, o arquivo refletirá corretamente o carimbo de data e hora da alteração. E nem todos os sistemas de controle de versão são confundidos com um carimbo de data / hora.
David
11
Como o David disse. Isso realmente era uma prática padrão do Unix não faz muito tempo e continua sendo uma prática padrão para desenvolvedores que trabalham fora dos IDEs.
Kkklam
12

Eu trabalhei com pelo menos uma estrutura da Web (não me lembro qual) que no modo de desenvolvimento observou os arquivos de código-fonte em busca de alterações e recarregou o aplicativo quando isso aconteceu.

É claro que às vezes você queria recarregar depois de alterar algo que não estava assistindo, e nesse caso toucho arquivo de configuração principal fez o truque.

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

millimoose
fonte
4
Este é realmente o caso com mod_wsgi e apache; você pode recarregar, por exemplo, um aplicativo da web django apenas tocando no arquivo wsgi.
sapi
11

Uso legítimo do toque:

  • Atualize o registro de data e hora dos arquivos de imagem (GIF / JPG / etc) para o horário em que foram tirados. Nem todos os renderizadores lêem ou prestam atenção às informações EXIF.
  • Mantenha o tempo c / m ao atualizar 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 (ou seja, CSV) se 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 :-))
  • Objetivos de arquivamento, ou seja, ter backups em pastas com base no ano e definir o horário nessas pastas para 1º de janeiro de AAAA para facilitar a classificação
sastorsl
fonte
7

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

Por exemplo, de qualquer maneira que você copia um arquivo (e de alguma maneira pode movê-lo), o novo arquivo tem um registro de data e hora do horário atual, em vez do registro de data e hora do arquivo original.

Geralmente, não é isso que se deseja. 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 como era antes das operações "editar ... desfazer edição".

Kevin Fegan
fonte
2
De fato. Tempo Trough eu encontrei alias cp='cp --preserve=timestamps'é mais adequado para mim na terra PC ...
Runium
5

Uma diferença importante em relação ao que thingsgosta echo(ou melhor ainda, > filecomo mencionado por outros) é que o toque não esmagará o conteúdo. > fileesvaziará um arquivo. touchnão vou. Em vez de pensar em truques para evitar danos ao conteúdo, basta usar o toque! De qualquer forma, ele fará menos trabalho no kernel, porque funcionará apenas com os atributos do arquivo, sem perder tempo, preparando-se para uma abertura e, em seguida, executando um fechamento.

Provavelmente, o toque pode alterar o registro de data e hora, mesmo que o arquivo esteja atualmente sob um bloqueio obrigatório ou consultivo ou em uma abertura exclusiva. Hmmm, nunca testei isso ou li sobre isso ...


fonte
2
>>será acrescentado em vez de sobrescrito #
Michael Mrozek
Eu considerei mencionar isso, mas está ficando ainda mais em território de efeitos colaterais. Você também teria que mencionar o fato de que isso geraria um erro se o arquivo já tivesse sido aberto exclusivamente, etc etc etc. Um problema que também poderia se aplicar através do uso de>. Eu acho que o meu ponto secundário - além do principal, que é marginalmente mais rápido apenas tocar nas estatísticas do arquivo - é que é uma boa ideia escrever um código que o indique diretamente, em vez de se preocupar.
4

Aqui está um - eu uso um programa de software chamado SageTV para gravar programas de TV - eles geralmente são 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 registro de data e hora do arquivo seja quando o programa de TV for iniciado - caso contrário, estrague a linha do tempo do programa para que não seja fácil FF ou REW. Portanto, uso o touch para redefinir o registro de data e hora do arquivo .mp4 para que seja o mesmo que o arquivo original.
Isso é legítimo?

Wayner
fonte
2

Freqüentemente você pode ter um processo que muda da ID do usuário, como da raiz -> outra coisa. O toque pode dar a chance de criar um arquivo em um local que somente a raiz pode tocar antes que o aplicativo inicie o logon como o outro usuário.

user56560
fonte
Isso não é um uso do toque que é inatingível por "eco" - veja a pergunta original do autor
Domingo Ignacio Galdos
Eco envolve abrir um fluxo e tal. O toque pode ser hiper otimizado trabalhando diretamente com inodes. DESEMPENHO FTW!
user56560
2

No trabalho, temos um arquivo de mapas digitais com mais de 15 anos. Esses mapas antigos são salvos em diversos 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 vê-los todos.

Para facilitar a pesquisa e a navegação fáceis de todos esses formatos diferentes, criamos versões jpeg dos mapas e, em seguida, usamos o touch para fazer com que o arquivo jpeg corresponda ao carimbo de data / hora do arquivo de origem original - geralmente anos depois que o original foi criado.

Agora podemos usar um único programa, como o Picasa, para ver toda a biblioteca e localizar trivialmente determinados períodos. Sem o toque, teríamos de adicionar metadados de data para cada imagem, provavelmente manualmente, e depois pesquisar essas strings ao procurar um período específico.

Matt Wilson
fonte
1

Ainda não o usei para esse fim, mas tenho um script que lê os arquivos e suas datas em um diretório e os lê para uso em uma página da Web. Se eu tiver que editar um, ele mudará sua data. Eu considerei que toucheles redefinissem sua ordem.

TecBrat
fonte
1

Alguns scripts de inicialização comparam o registro de data e hora de um arquivo de configuração com seu próprio arquivo pid. O resultado decide se recarrega ou não o serviço em execução.

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

Nils
fonte
0

Eu tenho um trabalho cron que obtém as alterações de um banco de dados que ocorreu entre a última execução do trabalho e a atual. Ele produz um arquivo XML das alterações que são processadas em um banco de dados diferente. Ele 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, convém repetir a execução a partir da data original e não da data mencionada no carimbo de data / hora do novo arquivo XML.

A maneira mais simples de fazer isso, em vez de editar os scripts chamados etc., é tocar no arquivo XML e forçar o carimbo de data / hora para ser a data que eu preciso.

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

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

Geeb
fonte