Windows equivalente ao comando Linux 'touch'?


175

O que você usa quando deseja atualizar o campo com data modificada de um arquivo no Windows?

  1. comandos acessíveis via C ++, .NET, C # ou algo nativo do Windows (Vista de preferência)
  2. ferramentas / aplicativos preferencialmente gratuitos e, se possível, de código aberto

Edit: já existe uma página para aplicativos, como apontado pelo CheapScotsman aqui .

Se alguém souber como eu posso fazer isso via C ++, C #, WSH ou algo semelhante, muito bem, acho que todo o resto é abordado na questão vinculada.


As quatro alternativas mencionadas acima, além de mais quatro não mencionados aqui, podem ser encontrados na resposta a uma pergunta semelhante: "Windows recursiva toque de comando"
JdeBP

stackoverflow.com/questions/210201/… menciona uma carga, incluindoREM.>a
barlop

Respostas:


356

Se você deseja tocar no carimbo de data de um arquivo usando o Windows, use o seguinte comando no prompt de comando:

copy /b filename.ext +,,

(onde filename.extestá o nome do seu arquivo). A +,,é uma bandeira especial para copycontá-la simplesmente atualizar a data / hora no arquivo :

* Alterando a hora e a data de um arquivo

Se você deseja atribuir a hora e a data atuais a um arquivo sem modificá-lo, use a seguinte sintaxe:

copy /b Source+,,

As vírgulas indicam a omissão do parâmetro Destination.

Edite com base nos comentários de Lumi e Justin: coloque isso em um arquivo em lotes, por exemplo. touch.cmd

@COPY /B %1+,, %1

Isso funciona mesmo que o arquivo não esteja no diretório atual (testado no Windows 7).


46
O que isso está fazendo? Onde está documentado? (O Google falha ao indexar "+ ,,", e o site da MS não está me levando na direção certa, pois pesquisar em 'copiar' não traz muita utilidade.) Quero dizer, funciona muito bem e eu aceito isso por certo, mas estou curioso.
traço-tom-bang


14
type touch.batis @echo offe next line copy /b %1 +,,- coloque-o C:\binou o que você tem para seus próprios scripts, e então você pode usá-lo como touch myfile.txt.
Lumi

17
No Win7, isso não funcionará se você não estiver na pasta que contém o arquivo. Ele criará uma cópia no diretório de trabalho atual.

6
Se você precisar fazer isso em uma pasta remota (caminho UNC) - você deve especificar o destino para o comando de cópia, bem como - copy /b Source+,, Source- onde Sourceinclui o caminho completo para o arquivo
Justin

162

Eu usei e recomendo unxutils, que são portas nativas do Win32, com muitos utilitários Unix comuns. Há um touchcomando lá.


6
Como quase todas as portas unix para Windows, isso não funciona com caracteres unicode nos nomes de arquivos fora do conjunto de codificação como o padrão para programas não unicode. Teste o nome do arquivo que desarmará todas essas ferramentas:"test тест τεστ.txt"
RomanSt 29/04

O gnuwin32 tem. mas, de fato, o gnuwin32 também falha em caracteres unicode.
barlop

1
Atualização de 2017 No Windows 10, podemos usar o subsistema Linux para Windows, que instala o bash. Não há necessidade de cygwin, MinGW, unxutils ou qualquer outro unix parcial para portas do Windows. docs.microsoft.com/en-us/windows/wsl/install-win10
Davos

@ David Você já tentou isso em qualquer arquivo que não seja o seu contexto de usuário (geralmente sem privilégios)? Porque tecnicamente o lado do usuário do LXSS está sendo executado como usuário não privilegiado.
0xC0000022L

@ 0xC0000022L não tenho certeza do que você quer dizer no contexto do touchcomando. É como qualquer outra coisa nos ambientes nix, você pode fazê-lo ou sudo-lo ou não, porque não tem privilégios.
Davos

96

Se tudo o que você deseja é alterar a data da última modificação do arquivo (que foi o meu caso):

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date

9
PowerShell FTW. Quero dizer, sério, o unix é legal, mas o PS é mais legal.
mate

1
Você pode atualizar a última vez que escreve para vários arquivos / pastas

12
Isso funcionará apenas em um arquivo. Para vários arquivos: ls * | ForEach-Object {$ _. LastWriteTime = Get-Date}
Eli Algranti

2
Se você quiser fazer isso recursivamente, isso funcionará muito bem: gci -recu -inc " . " | % {$ _. LastWriteTime = Get-Date}
BrainSlugs83 15/01

6
@ BrainSlugs83: use backticks `para código:gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date }
alldayremix

58
type nul >>file & copy file +,,
  • Cria filese não existir.
  • Deixa o conteúdo do arquivo sozinho.
  • Apenas usa cmdembutidos.
  • Os horários de último acesso e criação foram atualizados.

ATUALIZAR

Gah! Isso não funciona em arquivos somente leitura, ao contrário touch. Eu sugiro:

:touch
if not exist "%~1" type nul >>"%~1"& goto :eof
set _ATTRIBUTES=%~a1
if "%~a1"=="%_ATTRIBUTES:r=%" (copy "%~1"+,,) else attrib -r "%~1" & copy "%~1"+,, & attrib +r "%~1"

É uma pena que a cópia não possa ignorar o atributo + r da maneira que o xcopy faz. Ou é uma pena que o xcopy não suporte a filename +,,sintaxe estranha .
Abel

Infelizmente, isso não funciona (pelo menos não no Windows 7). Parece que o interpretador de comandos não atualiza o registro de data e hora do destino de um redirecionamento se o arquivo não for realmente modificado (ou seja, não há dados para redirecionar).
Synetech 15/09/2015

32

@ traço-tom-bang:

Aqui está a explicação de Technet sobre o misterioso '+' e vírgulas:

copiar / b Origem + ,,

As vírgulas indicam a omissão do parâmetro Destination.

O comando copy suporta a mesclagem de vários arquivos em um único arquivo de destino. Como um destino em branco não pode ser especificado usando um caractere de espaço no prompt de comando, duas vírgulas podem ser usadas para indicar isso.

E esta é a referência de comando de cópia da Technet: http://technet.microsoft.com/en-us/library/bb490886.aspx


16
Agora isso é apenas uma bagunça de sintaxe. Sério, o que eles estavam pensando? Observe também que a mesma documentação diz "Destino: obrigatório" ... Estou impressionado.
sth

1
Isso nem parece funcionar no Vista ... Será que eles voltaram a si?
quillbreaker

1
Funciona no Windows 7
Imran

5
Funcionou para mim mesmo sem vírgulas: copy file.ext + Portanto, a documentação está tão longe do comportamento real quanto do comportamento de qualquer expectativa razoável.
Abgan

2
Ele trabalhou no Windows Server 2008, mas só se você estiver na pasta que contém o arquivo
FrinkTheBrave


21

aqui está uma versão recursiva usando o powershell ... isso altera a hora da última modificação de todos os arquivos e subdiretórios e arquivos dentro dos subdiretórios deste diretório

ps c:myDir> Get-ChildItem . * -recurse | ForEach-Object{$_.LastWriteTime = get-date}

2
Menos detalhada, mas ainda usando atalhos PowerShell único padrão:ls * -recurse | % { $_.LastWriteTime = Get-Date }
Jonas

15

O projeto GnuWin32 possui portas Windows das versões Gnu dos utilitários de linha de comando Unix.

Ele vem como um número de pacotes separados e você pode instalar apenas os comandos necessários, sem outras dependências. Pois touchvocê precisaria do pacote CoreUtils .


15

cygwinvem com touch. Eu sei que você mencionou que não deseja instalar uma estrutura inteira, mas o cygwin é bastante leve e pode ser chamado na janela de comando dos sem que toda a linha de comando do tipo unix esteja ativada.

Você também pode controlar quais ferramentas instalar, para simplesmente instalar o touch.exearquivo e deixar o restante da estrutura.


2
Para o seu ponto aqui, tudo que você precisa instalar é o arquivo touch.exe e cygwin.dll em um diretório para usar a ferramenta. Não há outras dependências relacionadas ao uso de ferramentas baseadas no cygwin.
Alto Jeff

1
quando eu tentar isso (win7x64) Eu preciso de 4 cygwin dll, além de Touch.exe: cygiconv-2.dll cygintl-8.dll cygwin1.dll cyggcc_s-1.dll
Matt Wilkie

15

Eu tentei isso para criar um arquivo vazio no meu script em lotes. Você pode usar isto:

ECHO text>file1.txt

3
Este é DE longe o melhor método rápido .. Eu só precisava criar um arquivo .gitignore, e o Windows 7 continua reclamando "deve digitar um nome de arquivo" etc. etc. echo pie>.gitignoretrabalhou bem - obrigado!

4
@ Alex Isso não está relacionado, mas esse erro do Windows ocorre porque o arquivo começa com um ponto. Há um truque estranho para contornar isso no Windows Explorer: faça o arquivo terminar com um período também. Então digite .gitignore.e quando você pressiona enter, o Windows remove o período final. Louco, mas funciona.
precisa saber é o seguinte

1
Eu gostaria de poder dar votos suficientes para atrair os grandes jogadores em popularidade.
31816 Jonathan Mee #

1
Porém, isso não cria um arquivo vazio, file1.txt possui "texto".
21417 Joshua Meyers

14

Aqui está um regfile simples que escrevi para adicionar o botão direito do mouse em "touch" no Windows Explorer . Também seria fácil criar um script, já que apenas chama:

cmd.exe /c copy %1+nul %1 /by

E não se esqueça copy nul some_filede criar um arquivo vazio (que é o que eu vejo touchmais usado).
314 Joey

Ack! Arquivo zip inacessível (algo sobre brinkster22.com que precisa ser o site de referência). Jon, você pode atualizar isso?
Dan7119

Funciona no Win7. Não funciona no WinXP: o tempo do arquivo permanece o mesmo após a execução de "cópia".
Egor Skriptunoff


11

Experimente este no CodeProject .

  • Não há necessidade de instalar.
  • Se você quiser, você pode até modificar a fonte.

2
Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada.
Yan Sklyarenko

9

Você também pode instalar o Cygwin, que oferece o Touch, além de vários outros comandos * NIX.


2
não pode viver no Windows sem o cygwin.
jweede

E cygwin sem hortelã é bem manco.
Ahe


5

De uma pergunta semelhante no estouro de pilha.

Para atualizar os carimbos de data / hora (ignorando a outra funcionalidade de touch), eu usaria:

copy /b filename.ext +,,

1
Esta é uma repetição da resposta de Gish Domains de 2 anos antes, sem a explicação.
Fixer1234


4

a partir do site:

O Funduc Software Touch é um utilitário gratuito de 'toque' que permite alterar a hora / data e / ou atribuir carimbos em um ou mais arquivos. Além disso, o FS Touch pode adicionar / subtrair um número especificado de segundos do tempo do arquivo existente. Você pode especificar quais arquivos e / ou subdiretórios alterar através de 'máscaras de arquivos complexas'. O programa pode ser executado de forma interativa ou na linha de comando. Novo na versão 7.2 é uma opção de linha de comando para alterar o carimbo de data / hora modificado do arquivo +/- o número especificado de segundos.

O FS Touch é executado no Windows XP, Vista, Windows 7 e Windows 8.


4

Este conteúdo pode ser salvo em um arquivo reg. Isso adicionará um menu de contexto com o botão direito do mouse para todos os arquivos com a capacidade "Touch File" (testada no Windows 7). Copie todas as seguintes linhas para o arquivo reg. Execute o arquivo e aprove a pergunta. Clique com o botão direito do mouse em qualquer arquivo (ou vários arquivos) - a opção "Touch File" já está disponível.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell]

[HKEY_CLASSES_ROOT\*\shell\Touch File]

[HKEY_CLASSES_ROOT\*\shell\Touch File\command]
@="cmd /C copy /b \"%1\" +,,"

3

Se você estiver usando o git para um ou mais projetos, o mingw baseado git-bashno Windows possui o touchcomando Quero agradecer ao @ greg-hewgill por me indicar que os nix utilitários existem para o Windows, porque foi isso que me levou à ideia de tentar tocar no git-bash.


3

no PowerShell tente:

ni fileName.txt

NIé um alias do cmdlet New-Item .


1
Bem-vindo ao SuperUser. Obrigado por publicar! Você pode adicionar um link a um site que forneça mais informações sobre o nicomando e talvez descreva mais o que o comando faz?
Hby2Py

1
O New-Itemcmdlet não pode ser usado para atualizar o registro de data e hora de um arquivo existente.
Twisty Impersonator

Embora não atualize o carimbo de data / hora, ele cria um novo arquivo, que é o que o toque faz. +1 de mim.
MikeMurko

2

Salve o seguinte como touch.bat na sua pasta% windir% \ system32 ou adicione a pasta na qual ele é salvo à sua variável de ambiente PATH:

@echo off
if %1.==. goto end
if not exist %1 goto end
copy /b %1 +,, > nul
echo %1 touched!
:end

Uso da amostra:

touch *.cpp
touch somefile.c

Referência: Microsoft KB 69581


Excelente! Não há coisas externas, apenas copie. E, claro, a maioria de nós precisa dele como um stript lote :)
Bogdan Gavril MSFT

2

Encontrei uma maneira rápida de fazer isso se você tiver o vim instalado (não é bom para arquivos grandes, abrirá o arquivo inteiro e depois fechá-lo ...)

vim foobar.txt +wq!

O "+" define o argumento para executar os seguintes comandos. "wq!" é "escrever, sair, forçar". Isso abrirá o arquivo, salve-o e feche-o imediatamente depois.


Inutilmente complexo, volumoso e não portátil. -1
MD XF

2

Eu queria que o recurso 'toque' de clonar / duplicar as datas do arquivo de outro arquivo, nativamente, e fosse utilizável a partir de um arquivo em lotes.

Então, 'arraste e solte' o arquivo de vídeo no arquivo em lotes, o FFMPEG é executado e, em seguida, 'Data de criação' e 'Data de modificação' do arquivo de entrada são copiados para o arquivo de saída.

Isso pareceu simples no começo, até você achar que os arquivos em lotes são terríveis ao lidar com nomes de arquivos unicode, o PowerShell em linha mexe com os símbolos dos nomes dos arquivos e a fuga dupla deles é um pesadelo.

Minha solução foi transformar a parte 'touch' em um script separado do PowerShell, que chamei de 'CLONE-FILE-DATE.ps1' e contém:

param
(
  [Parameter(Mandatory=$true)][string]$SourcePath,
  [Parameter(Mandatory=$true)][string]$TargetPath
)

(GI -LiteralPath $TargetPath).CreationTime  = (GI -LiteralPath $SourcePath).CreationTime
(GI -LiteralPath $TargetPath).LastWriteTime = (GI -LiteralPath $SourcePath).LastWriteTime

Aqui está um exemplo de uso no meu arquivo em lotes 'CONVERT.BAT':

%~dp0\ffmpeg -i "%~1" ACTION "%~1-output.mp4"

CHCP 65001 > nul && PowerShell -ExecutionPolicy ByPass -File "%~dp0\CLONE-FILE-DATE.PS1" "%~1" "%~1-output.mp4"

Eu acho que o PowerShell é legível, então apenas explicarei o discurso do lote:

% ~ dp0 é o diretório atual do arquivo em lotes.

% ~ 1 é o caminho do arquivo solto no lote sem aspas.

CHCP 65001> nul define caracteres para UTF-8 e engole a saída.

-ExecutionPolicy ByPass permite executar o PowerShell sem a necessidade de modificar a política global, que existe para impedir que as pessoas executem scripts acidentalmente.


1

Experimentar

arquivo fsutil createnew new.txt 0


2
The FSUTIL utility requires that you have administrative privileges.- e não se comporta como touchnos arquivos existentes.
18712 Keith Thompson

1

As cinco alternativas mencionadas acima, mais três não mencionadas aqui, podem ser encontradas no SuperUser: "Comando de toque recursivo do Windows"


2
Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada.
Yan Sklyarenko


1

Bem, se você realmente deseja ter o touchcomando disponível, pode colocá-lo em um arquivo em lotes chamado touch.bate colá-lo C:\Windows:

TYPE NUL >>%1

Simples o suficiente.


Esse método NÃO atualiza o horário modificado nas seguintes plataformas: Windows Server 2012 R2, Windows Server 2016, Windows 10
Nate

0

O pessoal do Unix corrigiu o problema geral de atualizar a data de qualquer arquivo com o comando touch . No entanto, para Windows, às vezes é possível um método mais simples para casos especiais.

Preciso atualizar o carimbo de data e hora de um atalho do aplicativo no Windows 8.1 para tornar visíveis as alterações na cor de segundo plano do Ladrilho do Aplicativo. Consulte esta pergunta do SO . Em vez de implementar uma das ferramentas inteligentes acima, acho mais fácil editar o campo de comentário do atalho. A maioria das pessoas deixa isso vazio, mas é claro que um comentário útil é rapidamente concebido. E se houver um comentário, adicionar ou remover um período final nunca será prejudicial.


0

Compreendo que esta seja uma pergunta antiga, acabei de descobrir o toque no meu sistema Windows 10. Eu baixei e instalei o Git daqui (acho) e parece que o touch e vários outros utilitários estão na pasta bin.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.