No Windows 7, como posso tocar recursivamente todos os arquivos em um diretório (incluindo subdiretórios) para atualizar o carimbo de data / hora?
O Windows 7 tem um mecanismo para fazer isso?
No Windows 7, como posso tocar recursivamente todos os arquivos em um diretório (incluindo subdiretórios) para atualizar o carimbo de data / hora?
O Windows 7 tem um mecanismo para fazer isso?
Respostas:
Existem várias possibilidades:
Use uma porta de um touch
comando Unix e simplesmente combine find
e touch
da maneira Unix. Existem várias opções. Freqüentemente mencionados são GNUWin32 , cygwin e unxutils . Menos conhecidas, mas de certa forma melhores, são as ferramentas no kit de ferramentas do utilitário SFUA , que são executadas no Subsistema para Aplicativos Baseados em UNIX, que vem logo ali na caixa com o Windows 7 Ultimate edition e o Windows Server 2008 R2. (No Windows XP, é possível baixar e instalar o Services for UNIX versão 3.5 .) Este kit de ferramentas possui um grande número de ferramentas TUI de linha de comando, de mv
e du
, através dos shells Korn e C, paraperl
e awk
. Ele vem nos sabores x86-64 e IA64, bem como no x86-32. Os programas são executados no ambiente POSIX nativo e adequado do Windows, em vez de com DLLs de emulador (como cygwin1.dll
) sobrepor coisas no Win32. E sim, o kit de ferramentas tem touch
e find
, assim como outras 300 outras.
Todos esses kits de ferramentas têm a conhecida desvantagem de executar um processo separado para cada arquivo a ser tocado, é claro. Isso não é um problema com as seguintes alternativas.
Use um dos muitos touch
comandos nativos do Win32 que as pessoas escreveram e publicaram. Muitos deles suportam opções para executar recursão, sem a necessidade de um Unix find
envolvê-los. (Afinal, eles estão alvejando uma base de usuários que procura um touch
comando, porque ele não possui toda uma carga de comandos do Unix portados.) Um deles é o Stéphane Duguay,touch
que, como você pode ver, tem uma --recursive
opção.
Seja esperto com os misteriosos mistérios do CMD. Como mencionado na outra resposta, COPY /B myfile+,,
atualizará o carimbo de data da última modificação de um arquivo, usando a sintaxe "plus" pouco conhecida do COPY
comando (mais sobre isso pode ser encontrado aqui , aliás). É claro que isso pode ser combinado com FOR /R
a execução recursiva da operação, como sugerido em outra resposta aqui.
Use um intérprete de comando de substituição e seja menos inteligente e mais direto que o CMD. O TCC / LE da JP Software é um desses. Ele adiciona uma /S
opção ao seu COPY
comando , o que significa que é possível usar COPY /S
com a sintaxe "mais" para eliminar a necessidade de um FOR
wrapper. Mas isso ainda está dificultando a vida desnecessariamente, considerando que o TCC / LE possui um comando TOUCH integrado que suporta diretamente uma /S
opção.
COPY /B file+,,
é o caminho a percorrer, não requer extras ... :-)
(ls file).LastWriteTime = DateTime.now
Para usar apenas a funcionalidade existente do Windows (nada extra para instalar), tente um destes:
forfiles /P C:\Path\To\Root /S /C "cmd /c Copy /B @path+,,"
(toque "recursivamente" em todos os arquivos que começam no caminho especificado)
OU
forfiles /S /C "cmd /c Copy /B @path+,,"
(toque "recursivamente" em todos os arquivos que começam no diretório atual)
Sei que provavelmente é um pouco tarde demais, mas, no entanto, deixarei minha resposta caso alguém precise da mesma coisa.
A resposta de John T não funcionou para mim no Windows 7. Depois de algumas pesquisas, encontrei este utilitário chamado SKTimeStamp , que faz o trabalho perfeitamente.
Aqui está um artigo com mais detalhes sobre como ele funciona: http://www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and -acessado / .
Aqui estão as etapas que você precisa executar:
Voila! Todos os seus arquivos foram atualizados! Não há necessidade de utilitários unix ou linhas de comando.
Ou você pode usar as ferramentas já incorporadas no Windows, uma vez que já tenha algum tipo de ferramenta de "toque":
for /r %i in (C:\Path\To\Root\*) do @touch "%i"
OU
forfiles /P C:\Path\To\Root /S /C "touch @file"
(Nota: se você estiver fazendo isso a partir de um arquivo em lotes e quiser usar o for
comando, certifique-se de usar sinais de porcentagem dupla para suas variáveis. (Por exemplo, em %%i
vez de %i
)
Usando o PowerShell:
C:\> powershell (ls your-file-name-here).LastWriteTime = Get-Date
The property 'LastWriteTime' cannot be found on this object.
Em referência à resposta de John T acima:
Eu estava tentando entender a diferença entre finalizar find
o comando exec de um com a \;
e um `+ '(eu não sabia do último).
Isso foi útil: ( daqui )
-exec command ;
Executar comando; true se 0 status for retornado. Todos os seguintes argumentos a serem encontrados são considerados argumentos para o comando até um argumento que consiste em ';' é encontrado. A string '{}' é substituída pelo nome do arquivo atual sendo processado em todos os lugares em que ocorre nos argumentos do comando, não apenas nos argumentos em que está sozinho, como em algumas versões do find.
-exec command {} +
Essa variante da ação -exec executa o comando especificado nos arquivos selecionados, mas a linha de comandos é criada anexando cada nome de arquivo selecionado no final; o número total de invocações do comando será muito menor que o número de arquivos correspondentes. A linha de comando é construída da mesma maneira que o xargs cria suas linhas de comando. Somente uma instância de '{}' é permitida dentro do comando. O comando é executado no diretório inicial.
Considere uma pasta c:\myfolder
contendo 2 arquivos a.txt
eb.txt
find . -type f -exec touch {} +
é interpretado como: touch a.txt b.txt
find . -type f -exec touch {} \;
é interpretado como:touch a.txt
touch b.txt
Portanto, o número 1 é muito mais rápido (mas também sofre com a limitação de que o comando a seguir exec
pode ter apenas um {}
espaço reservado).