Comando de toque recursivo do Windows

16

No Windows 7, como posso recursivamente tocar todos os arquivos em um diretório (incluindo subdiretórios) para atualizar o carimbo de data / hora?

O Windows 7 tem um mecanismo para realizar isso?

    
por jmq 28.02.2011 / 19:12

8 respostas

19

Existem várias possibilidades:

  • Use uma porta do comando Unix touch e simplesmente combine find e touch da maneira Unix. Existem várias opções. Muitas vezes são GNUWin32 , cygwin e unxutils . Menos conhecidas, mas, de certa forma, melhores, são as ferramentas do Kit de ferramentas do utilitário SFUA , que é executado no Subsistema para Aplicativos Baseados no UNIX que vem ali na caixa com o Windows 7 Ultimate edition e Windows Server 2008 R2. (Para o Windows XP, pode-se download e instale Serviços para UNIX versão 3.5 .) Este kit de ferramentas possui um grande número de ferramentas de TUI de linha de comando, de mv e du , através dos shells Korn e C, até perl e awk . Ele vem em ambos os sabores x86-64 e IA64, bem como x86-32. Os programas são executados no ambiente POSIX nativo do Windows, em vez de com as DLLs do emulador (como cygwin1.dll ) em camadas sobre o Win32. E sim, o kit de ferramentas tem touch e find , além de outros 300.
    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 alternativas a seguir.

  • Use um dos muitos comandos nativos Win32 touch que as pessoas escreveram e publicaram. Muitos deles suportam opções para executar a recursão, sem a necessidade de um Unix find para envolva-os. (Eles estão, afinal de contas, visando uma base de usuários que está procurando por um comando touch porque ele não tem uma carga inteira de comandos Unix portados.) Um deles é touch do Stéphane Duguay que, como você pode ver, tem uma opção --recursive .

  • Fique esperto com os mistérios arcanos do CMD. Como mencionado na outra resposta, COPY /B myfile+,, atualizará o último registro de data de modificação de um arquivo, usando a sintaxe pouco conhecida de "mais" o comando COPY (mais sobre o que pode ser encontrado aqui , aliás). Isso, claro, pode ser combinado com FOR /R para executar a operação recursivamente, como sugerido em outra resposta aqui.

  • Use um interpretador de comandos de substituição e seja menos inteligente e mais direto do que o CMD. TCC / LE da JP Software é um desses. Ele adiciona uma opção /S ao seu comando COPY , o que significa que é possível usar COPY /S com a sintaxe "plus" para eliminar a necessidade de um wrapper FOR . Mas isso ainda está tornando a vida desnecessariamente difícil para você, considerando que o TCC / LE tem um comando TOUCH embutido que suporta diretamente uma opção /S .

por 28.02.2011 / 20:54
5

Como eles estão prontamente disponíveis, eu recomendaria tirar proveito dos unxutils . Eles incluem os comandos find e touch , o que tornará isso muito fácil.

Depois de mudar para o diretório mais importante que você deseja modificar:

find . -type f -exec touch {} +
    
por 28.02.2011 / 19:20
4

Eu sei que isso é um pouco tarde demais, mas mesmo assim deixarei minha resposta para o caso de alguém precisar 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.

Veja um artigo com mais detalhes sobre como funciona: link .

Aqui estão os passos que você precisa realizar:

  • Instale o aplicativo
  • Ir para o diretório em que você precisou alterar os timestamps
  • Pesquise * na caixa de pesquisa para que o explorador mostre todos os arquivos
  • Quando todos os arquivos forem encontrados, selecione-os, clique com o botão direito do mouse e escolha Propriedades
  • Na caixa de diálogo, escolha a guia "TimeStamps"
  • Ajuste suas datas e horários conforme necessário e clique em Touch

Voila! Todos os seus arquivos foram atualizados! Não há necessidade de quaisquer utilitários unix ou linhas de comando.

    
por 30.12.2011 / 15:53
4

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+,,"  

(recursivamente "tocar" todos os arquivos que começam no caminho especificado)

OR

forfiles /S /C "cmd /c Copy /B @path+,,"   

(recursivamente "toque" todos os arquivos que estão começando no diretório atual)

    
por 25.05.2012 / 08:07
1

Ou você pode usar as ferramentas já incorporadas no Windows, uma vez que você já possui uma ferramenta de "toque":

for /r %i in (C:\Path\To\Root\*) do @touch "%i"

OR

forfiles /P C:\Path\To\Root /S /C "touch @file"

(NB: Se você estiver fazendo isso a partir de um arquivo em lote e quiser usar o comando for , certifique-se de usar sinais de dois por cento para suas variáveis. (ex: %%i em vez de %i )

    
por 28.02.2011 / 19:44
1

Também falhou no Windows 7 para mim. Eu usei uma sintaxe diferente e consegui que funcionasse:

forfiles /c "cmd /c touch @file"

Note que não usei a opção de recurse.

    
por 02.03.2012 / 07:19
1

Usando o powershell:

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date
    
por 10.02.2016 / 19:29
0

Em referência à resposta de John T acima:

Eu estava tentando entender a diferença entre terminar o comando exec de find com um \; e um '+' (eu não sabia do último).

Isso foi útil: (de aqui )

-exec command ;
    Execute o comando; true se o status 0 for retornado. Todos os argumentos a seguir para encontrar são considerados argumentos para o comando até que um argumento consistindo de ';' é 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 comando é 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 constrói suas linhas de comando. Apenas 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 e b.txt

  1. find . -type f -exec touch {} + é interpretado como:
    touch a.txt b.txt
    Isso é semelhante ao modo como o xargs funciona

  2. enquanto find . -type f -exec touch {} \; é interpretado como: touch a.txt e touch b.txt

Assim, o número 1 é muito mais rápido (mas também sofre com a limitação de que o comando seguinte exec pode ter apenas um espaço reservado {} ).

    
por 19.11.2012 / 14:20